zoukankan      html  css  js  c++  java
  • 前序中序后序非递归遍历


    //
    二叉树的表示
    typedef struct TNode* BinTree; struct TNode { ElementType Data; BinTree Left; BinTree Right; }; //二叉树 前序 非递归 void InOrderTraversal(BinTree BT) { BinTree T = BT; Stack S = CreateStack(MaxSize); while(T || !IsEmpty(S)) { while(T) //直到左子树为空停止向左下访问 { Push(S,T); printf("T->Data"); //由于为前序遍历,当第一次遇到根节点就打印他 T = T->Left; } if(!IsEmpty(S)) { T = Pop(S); T = T->Right; //开始访问右子树 } } } //二叉树 中序遍历 非递归 void MidOrderTraversal(BinTree BT) { BinTree T = BT; Stack S = CreateStack(MaxSize); while(T || !IsEmpty(S)) { while(T) { Push(S,T); T = T->Left; } if(!IsEmpty(S)) { T = Pop(S); printf("T->Data"); //当第二次遇到根节点则打印他 T = T->Right; } } } //二叉树的表示 typedef struct TNode* BinTree; typedef struct TNode* BinTree; struct TNode { ElementType Data; BinTree Left; BinTree Right; int flag; //用一个flag记录是第几次遇到根节点 }; //二叉树 后序遍历 非递归 void UnOrderTraversal(BinTree BT) { BinTree T = BT; Stack S = CreateStack(MaxSize); while(T || !IsEmpty(S)) { while(T) { Push(S,T); T->flag = 1; T = T->Left; }
    if(!isEmpty(S))
    { T
    = Top(S); if(T->flag == 1) //当第二次遇到根节点,则不应当将其弹出,而是访问其右子树 { T->flag++; T = T->Right; }else if(T->flag == 2) //第三次遇到根节点,此时左右子树都访问完了,可以打印并弹出他了 { printf(T->Data); Pop(S);
    T = NULL; }
    } } }

     一张图表示非递归遍历的实质:

    我们如何找到左子树,因为我们先访问根节点,所以根据根节点中保存的左子树的地址,可以向左下访问。

    那左子树访问完了,如何回来访问右子树呢?

    这就是栈的作用!!!!

    栈顶保存着上一次最后遇到的根节点,把栈顶元素弹出,则可以“往回走”,借此可以访问右子树

  • 相关阅读:
    编程题:数组中出现超数组长度一半的数字
    编程题:两数之和&数组中相加为0的三元数组
    编程题:最小矩阵路径
    编程题:斐波那契数列青蛙跳台阶
    向excel文件中写内容
    Java:使用jxl读取excel文件内容
    索尼1a dac插电脑用什么驱动。在哪下载,求助
    idea启动项目报端口号冲突或被占用
    两分钟解决IntelliJ IDEA中文乱码问题
    IntelliJ IDEA以不同格式导出数据库的数据
  • 原文地址:https://www.cnblogs.com/dzy521/p/9382022.html
Copyright © 2011-2022 走看看