zoukankan      html  css  js  c++  java
  • 数据结构:树

    CommonInc.h

     1 #pragma once
     2 #include <iostream>
     3 #include <vector>
     4 #include <deque>
     5 #include <stack>
     6 
     7 // BFS 使用了deque
     8 // DFS 使用了递归,什么时候使用了stack
     9 // DFS 不使用递归
    10 // 创建前驱节点和后驱节点
    11 
    12 // 前序中序和后序
    13 
    14 using namespace std;
    15 template<typename T>
    16 struct Node
    17 {
    18     Node(T data)
    19     {
    20         this->data = data;
    21         left = right = nullptr;
    22     }
    23     T data;
    24     Node* left;
    25     Node* right;
    26 };
    27 using IntNode = Node<int>;
    28 using CharNode = Node<char>;
    View Code

    BinTree(二叉树的遍历,递归和非递归)

    #include "CommonInc.h"
    //Broad First Search
    void BFS(IntNode* root)
    {
        if (root == nullptr) return;
        deque<IntNode*> dqNodes;
        dqNodes.push_back(root);
        IntNode* tmpNode;
        while (dqNodes.size() > 0)
        {
            tmpNode = dqNodes.front();
            cout << tmpNode->data << endl;
            if (tmpNode->left != nullptr)
            {
                dqNodes.push_back(tmpNode->left);
            }
            if (tmpNode->right != nullptr)
            {
                dqNodes.push_back(tmpNode->right);
            }
            dqNodes.pop_front();
        }
    }
    //递归
    void DFS_Recursive(IntNode* node)
    {
        if (node == nullptr)    return;
        cout << node->data << endl;
        if (node->left != nullptr)
            DFS_Recursive(node->left);
        if (node->right != nullptr)
            DFS_Recursive(node->right);
    }
    //中序
    void DFS_Recursive_Mid(IntNode* node)
    {
        if (node == nullptr)    return;
        if (node->left != nullptr)
            DFS_Recursive(node->left);
        cout << node->data << endl;
        if (node->right != nullptr)
            DFS_Recursive(node->right);
    }
    
    //这一块逻辑不清晰
    //没有使用递归借助了两个容器, 有问题:每一次添加到vector中都对其进行了判定
    void DFS(IntNode* root)
    {
        if (root == nullptr)    return;
        stack<IntNode*> skNodes;
        vector<IntNode*> vctNodes;
        IntNode* tmpNode = nullptr;
        bool bLeft = true;
        vctNodes.push_back(root);
        skNodes.push(root);
        bool bSearched = false;
        while (skNodes.size() > 0)
        {
            tmpNode = skNodes.top();
            bSearched = false;
            if (tmpNode->left != nullptr)
            {
                if (std::find(vctNodes.begin(), vctNodes.end(), tmpNode->left) == vctNodes.end())
                {
                    skNodes.push(tmpNode->left);
                    vctNodes.push_back(tmpNode->left);
                    bSearched = true;
                    continue;
                }
            }
            //最近弹出的节点为左子节点,那么判断右子节点
            if (tmpNode->right != nullptr)
            {
                if (std::find(vctNodes.begin(), vctNodes.end(), tmpNode->right) == vctNodes.end())
                {
                    skNodes.push(tmpNode->right);
                    vctNodes.push_back(tmpNode->right);
                    bSearched = true;
                    continue;
                }
            }
            if (tmpNode->left == nullptr && tmpNode->right == nullptr)
            {
                skNodes.pop();
            }
            else if (!bSearched)
            {
                skNodes.pop();
            }
        }
    
        for (int i = 0; i < vctNodes.size(); i++)
        {
            cout << vctNodes[i]->data << endl;
        }
    }
    
    //  15 - 23 - 44
    //            - 25 - 32
    //                 - 16
    
    int maind()
    {
        IntNode* root = new IntNode(15);
        IntNode* node = new IntNode(23);
        root->left = node;
        node->left = new IntNode(44);
        node->right = new IntNode(25);
        node = node->right;
        IntNode* node1 = new IntNode(32);
        IntNode* node2 = new IntNode(16);
        node->left = node1;
        node->right = node2;
    
        //BFS(root);
        DFS_Recursive_Mid(root);
        cout << "-----------------------------------------" << endl;
        DFS(root);
        return 0;
    }
    View Code

    二叉树的前序中序和后序遍历

    //所谓的前中后续遍历 都是基于深度优先
    //打印的话 如果先打印则为前序
    // 访问完左节点,再打印  则为中序
    // 左右节点访问后,再打印则为后序遍历
    //前序
    void DSF_Prev(CharNode* node)
    {
        if (node == nullptr)    return;
        cout << node->data;
        if (node->left != nullptr)
            DSF_Prev(node->left);
        if (node->right != nullptr)
            DSF_Prev(node->right);
    }
    //中序
    void DSF_Mid(CharNode* node)
    {
        if (node == nullptr)    return;
        if (node->left != nullptr)
            DSF_Mid(node->left);
        cout << node->data;
        if (node->right != nullptr)
            DSF_Mid(node->right);
    }
    //后序
    void DSF_Next(CharNode* node)
    {
        if (node == nullptr)    return;
        if (node->left != nullptr)
            DSF_Prev(node->left);
        if (node->right != nullptr)
            DSF_Prev(node->right);
        cout << node->data;
    }
    
    
    int main()
    {
        CharNode* root = new CharNode('A');
        CharNode* left = new CharNode('B');
        CharNode* right = new CharNode('C');
        root->left = left;
        root->right = right;
        left->left = new CharNode('D');
        left->right = new CharNode('E');
        CharNode* cur = left->left;
        cur->left = new CharNode('H');
        cur->right = new CharNode('I');
        cur = left;
        cur->right = new CharNode('E');
        cur->right->left = new CharNode('J');
    
        cur = right;
        cur->left = new CharNode('F');
        cur->right = new CharNode('G');
    
        DSF_Prev(root);
        cout << endl;
        DSF_Mid(root);
        cout << endl;
        DSF_Next(root);
        return 0;
    }
    View Code
  • 相关阅读:
    sencha touch 扩展篇之将sencha touch打包成安装程序(上)- 使用sencha cmd打包安装程序
    sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标
    一个不错的android组件的网站
    sencha touch 扩展篇之使用sass自定义主题样式 (上)使用官方的api修改主题样式
    sencha touch 入门系列 (九) sencha touch 布局layout
    面试题总结
    国外接活网站Elance, Freelancer和ScriptLance的介绍和对比
    sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
    Android Design Support Library——Navigation View
    设计模式——命令模式
  • 原文地址:https://www.cnblogs.com/yang131/p/13859725.html
Copyright © 2011-2022 走看看