树的四种遍历方式

1.树的中序遍历非递归

思路使用stack替换掉递归(第一种写法 )

第一种写法是

while(两个条件)
        while(条件一)
        if(条件二)

1 . while(两种情况)
- 直走到树的最左边结点,把左边的结点全部压入stack,
- 走完左边的结点后,出stack, 继判断是否最左边的结点是否有右结点
== 如果有右结点,则对这个子树执行(1)中同样的操作,回到步骤一==

2.出stack的同时访问结点

代码(Java)

 // Definition for a binary tree node.
  public class TreeNode {
   
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) {
    val = x; }
  }

class Solution {
   
    public List<Integer> inorderTraversal(TreeNode root) {
   
        List<Integer> result =new ArrayList<>();
        if(root==null) return result;
        Stack<TreeNode> tmp = new Stack<>();
        TreeNode p = root;
        //p是遍历指针,如果一直有最左边结点,一直遍历; 第二种情况是如果没有最左边结点,就要访问stack中的结点
        while(p!=null || !tmp.isEmpty()) {
   
            //两种情况
            //第一种情况,来到最左边的结点,最左边的结点肯定是没有左孩子结点
            while (p != null) {
   
                tmp.add(p);
                p = p.left;
            }

            //判断最左边的结点是否有右结点,继续按照上面的步骤遍历遍历到其最左边的结点
            if (!tmp.isEmpty()) {
   
                //遍历最左边的结点
                TreeNode t = tmp.pop();
                result.add(t.val);
                if (t.right != null)
                    p = t.right;
                   }
        }
        return result;
    }
}

c++

class 
  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值