4.2 二叉树递归和非递归遍历(结合栈)

本文介绍了如何使用栈进行非递归遍历二叉树,特别是后序遍历的方法。首先讲解了栈的基本操作,如入栈、出栈、访问栈顶元素等。接着详细阐述了两种非递归后序遍历的思路,一种通过判断结点是否首次出现在栈顶来控制访问顺序,另一种则通过判断结点的左右孩子是否已访问来确定访问时机。最后,文章提到isalpha()函数用于检测字符是否为字母,并指出对栈在二叉树遍历中的理解尚存疑惑。
摘要由CSDN通过智能技术生成

一、注意点

1、<stack>头文件

      入栈,s.push(x);
      出栈,s.pop();  (出栈操作只是删除栈顶元素,并不返回该元素)
      访问栈顶,s.top()
      判断栈空,s.empty(),当栈空时,返回true。
      访问栈中的元素个数,s.size()
      stack<BinTree*> s;  //建一个空栈存放s结点,即  Stack s = CreatStack( MaxSize ) ;

2、非递归后续遍历的两种思路

      第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还未被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是否是第一次出现在栈顶。

      第二种思路:要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

3、小补充

      isalpha()判断一个字符是否是字母

 while(scanf("%s",s)==1)  //scanf的返回值由后面的参数是否成功读入决定。这里是一个%s参数,成功读入后返回1;若是"%s%s",都成功返回2,都不成功返回0

 二、代码及疑问

   对于栈在二叉树中的应用还不太明白,尤其是二叉树创建和非递归后序遍历。。。

#include <iostream>
#include<string.h
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值