打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
二叉树的后序遍历

如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。

遍历结果为:4526731。。

1、递归操作:

思想:若二叉树为空,返回。否则

1)后序遍历右子树;2)后序遍历左子树;3)遍历根节点

代码:

void PostOrder(BiTree root)  {      if(root==NULL)          return ;      PostOrder(root->lchild);      //递归调用,后序遍历左子树      PostOrder(root->rchild);      //递归调用,后序遍历右子树      printf("%c ", root->data);    //输出数据    }  

2、非递归操作

代码:

void PostOrder_Nonrecursive(BiTree  T)  // 后序遍历的非递归    {        stack<BiTree> S;        BiTree curr = T ;           // 指向当前要检查的节点      BiTree previsited = NULL;    // 指向前一个被访问的节点      while(curr != NULL || !S.empty())  // 栈空时结束        {            while(curr != NULL)            // 一直向左走直到为空          {                S.push(curr);                curr = curr->lchild;            }            curr = S.top();          // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点          if(curr->rchild == NULL || curr->rchild == previsited)            {                cout<<curr->data<<"  ";                previsited = curr;                S.pop();                curr = NULL;            }            else              curr = curr->rchild;      // 否则访问右孩子      }    }   

或者采用双栈操作,代码:

void PostOrder_Nonrecursive1(BiTree  T)  // 后序遍历的非递归 --双栈法  {        stack<BiTree> s1 , s2;        BiTree curr ;           // 指向当前要检查的节点      s1.push(T);      while(!s1.empty())  // 栈空时结束        {          curr = s1.top();          s1.pop();          s2.push(curr);          if(curr->lchild)              s1.push(curr->lchild);          if(curr->rchild)              s1.push(curr->rchild);      }      while(!s2.empty())      {          printf("%c ", s2.top()->data);          s2.pop();      }  }  

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数据结构_二叉树的遍历_课程设计
二叉树的各种操作
转:二叉树
用非递归的方法中序遍历二叉树
二叉树的遍历;前序 中序 后序遍历二叉树;递归 非递归实现; 重建二叉树;编程之美重建二叉树
【经典面试题二】二叉树的递归与非递归遍历(前序、中序、后序)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服