zoukankan      html  css  js  c++  java
  • 二叉树的后续非递归遍历

    void TraverseTree(BTree BT)
    {
        StackTree S;
        StackTag  tag;
        BTree p=BT;
        while (p!=NULL||!IsEmpty(S))
        {
            while (p)
            {
                push(S,p);
                push(tag,0);
                p=p->pLchild;
            }
            if (Top(S)->pRchild==NULL||Top(tag)==1)
            {
                BTree temp=Pop(S);
                Pop(tag);
                cout<<temp->element;
                p=NULL;
            } 
            else
            {
                Pop(tag);
                push(tag,1);
                p=Top(S)->pRchild;
            }
        }
    }

    二叉树后续非递归遍历基本思想:

    (1)当树非空时,将指针p指向根节点,p为当前节点指针。

    (2)当p压入栈s中,0压入栈tag中,并令p指向其左孩子

    (3)重复执行步骤(2),直到p为空。

    (4)如果tag栈中的栈顶元素为1,跳至步骤(6)。

    (5)如果tag栈中栈顶元素为0,跳至步骤(7)。(用来表示还问访问右子树)

    (6)将栈S的栈顶元素取出,并访问,弹出栈S和tag的栈顶元素,并另p=NULL,跳至步骤(8)。

    (7)将p指向栈顶元素的右孩子,弹出栈tag的栈顶元素,再把1压入栈tag中。(用来标记从右子树返回)

    (8)重复指向步骤(2)~(7),直到p为空并且栈s也为空。

    (9)遍历结束。

     1 void PostOrder(BiTree BT){
     2     stack S;
     3     stack tag;
     4     BiTree p=BT;
     5     while(p!=NULL||!isEmpty(S)){
     6         while(p!=NULL){//直到左孩子为空
     7              push(S,p);//将p进栈
     8              push(0,tag);//表示p的右子树还未访问或者是从左子树返回
     9              p=p->lchild;//指向其左孩子
    10         }
    11         if(Top(tag)==1){//从右子树返回
    12              p=Top(S);
    13              printf("%c",p->data);
    14              pop(S);
    15              pop(tag);
    16              p=NULL;
    17         }else{//从左子树返回
    18              p=Top(S);
    19              if(!StackEmpty(S)){
    20                  p=p->rchild;
    21                  Pop(tag);
    22                  Push(1,tag);
    23              }
    24         }
    25     }
    26 }
  • 相关阅读:
    递归要记得返回
    git push的时候报Unable to find remote helper for 'https'的错误
    iphone手机上的click和touch事件
    对jquery的conflict方法的解读
    开发富文本编辑器的一些体会
    使用jquery制作动态加载型菜单
    解决jquery$命名符和其它框架的冲突问题
    基于geolocation来获取经纬度地址
    Python学习笔记2解析数据
    Python学习笔记1数据类型
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2513663.html
Copyright © 2011-2022 走看看