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; }
    } } }

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

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

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

    这就是栈的作用!!!!

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

  • 相关阅读:
    c#RSA的SHA1加密与AES加密、解密
    c#后台代码请求访问api接口
    Hbuilder给手机发送短信与拨打电话
    Hbuilder获取手机当前地理位置的天气
    plus.webview.create( url, id, styles, extras )参数及说明
    九九乘法表+冒泡排序(校园回忆录)
    c#数据处理总结(分组、交并差与递归)
    Hbuilder MUI 下拉选择与时间选择器
    JAVA常用开源工具与项目
    mysql 中常用功能
  • 原文地址:https://www.cnblogs.com/dzy521/p/9382022.html
Copyright © 2011-2022 走看看