zoukankan      html  css  js  c++  java
  • 【数据结构】二叉树遍历

    先序遍历和中序遍历非递归代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    typedef struct BinaryTree 
    {
        int data;
        struct BinaryTree *rchild, *lchild;
    }BinaryTree;
    
    int createBinaryTree( BinaryTree * &T)  //必须用引用 因为内存是在函数里面分配的
    {
            int ch;
            scanf("%d", &ch);
    
            if(ch != 0)
            {
                T = (BinaryTree *)malloc(sizeof(BinaryTree));
                T->data = ch;
                createBinaryTree(T->lchild);
                createBinaryTree(T->rchild);
            }
            else
            {
                T = NULL;
            }
        return 0;
    }
    
    int visit(int data)
    {
        printf("%d ", data);
        return 0;
    }
    
    
    int PreOrderTraverse(BinaryTree T) //先序遍历  
    {
        BinaryTree* p;
        vector<BinaryTree *> Stack;
        Stack.push_back(&T);
        while(!Stack.empty())
        {
            while((p = Stack.back()) != NULL) 
            {
                visit(p->data);
                Stack.push_back(p->lchild);
            }
            Stack.pop_back();
            if(!Stack.empty())
            {
                p = Stack.back(); 
                Stack.pop_back();
                Stack.push_back(p->rchild);
            }
        }
        return 0;
    }
    
    
    int InOrderTraverse(BinaryTree T) //中序遍历
    {
        BinaryTree* p;
        vector<BinaryTree *> Stack;
        Stack.push_back(&T);
        while(!Stack.empty())
        {
            while((p = Stack.back()) != NULL) 
                Stack.push_back(p->lchild);
            Stack.pop_back();
            if(!Stack.empty())
            {
                p = Stack.back(); 
                Stack.pop_back();
                visit(p->data);
                Stack.push_back(p->rchild);
            }
    
        }
        return 0;
    }
    
    int main()
    {
        BinaryTree * T = NULL;
        createBinaryTree(T);
        PreOrderTraverse(*T);
        InOrderTraverse(*T);
        return 0;
    }

    注意理清楚弹栈的机制。

    ---------------------------------

    今天参考了一下别人的思路 补上后序遍历非递归算法 注意如何设置在右子树弹出时双亲结点的访问和弹出

    int AferOrderTraverse(BinaryTree T) //后序遍历
    {
        BinaryTree * p;
        vector<BinaryTree *> Stack;
        int tag[30] = {0}; //用tag标签记录存入的是左子树0 还是右子树1
        int tagnum = 0; //记录存放的数量
        Stack.push_back(&T);
        tag[0] = 0;
        tagnum = 1;
    
        while(!Stack.empty())
        {
            while((p = Stack.back())!= NULL)
            {
                Stack.push_back(p->lchild);
                tag[tagnum++] = 0;
            }
            //只要右子树弹出,其双亲结点就被访问并弹出
            while(tag[tagnum - 1] == 1)  //若是右子树 先弹出开始的空集 访问其parent结点(一定是其上一个结点) 再循环弹出
            {
                Stack.pop_back();
                tagnum--;
                visit(Stack.back()->data);
            }
            Stack.pop_back();
            tagnum--;
        
            if(!Stack.empty())
            {
                p = Stack.back();
                Stack.push_back(p->rchild);
                tag[tagnum++] = 1;
            }
        }
        return 0;
    }
  • 相关阅读:
    从零开始搭建VUE项目
    推送类型
    spring整合消息队列rabbitmq
    Terracotta
    MYSQL INNODB 存储引擎
    Java 各种读取文件方法以及文件合并
    spring-security用户权限认证框架
    Spring Bean初始化过程
    使用PLSQL客户端登录ORACLE时报ORA-12502和ORA-12545错误的解决方案
    计算机语言基础概况
  • 原文地址:https://www.cnblogs.com/dplearning/p/3732745.html
Copyright © 2011-2022 走看看