当前位置:首页 » 《随便一记》 » 正文

【非递归实现】二叉树的前中后序遍历_m0_52373742的博客

0 人参与  2021年11月06日 13:23  分类 : 《随便一记》  评论

点击全文阅读


二叉树的前中后序遍历

核心思想:用栈来实现对节点的存储。一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成。

前序遍历

//非递归
//根 左 右
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        //用数组来存储前序遍历结果
        List<Integer> list = new ArrayList<>();
        if(root==null)  return list;
        
        //创建一个栈
        Stack<TreeNode> st = new Stack<>();
        //cur指向根节点
        TreeNode cur = root;
        
        while(!st.isEmpty()||cur!=null){
        
            //一边向左遍历,一边将遍历到的节点入栈,节点值入数组
            while(cur!=null){
                list.add(cur.val);
                st.push(cur);	//根
                cur=cur.left;	//左
            }
            
            //指针指向栈顶节点(即上一个节点),并将栈顶节点出栈
            cur = st.pop();
            //指针指向该节点的右子树,开始下一轮的遍历
            cur = cur.right;	//右
        }
        return list;
    }
}

中序遍历

//非递归
//左 根 右
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        
      List<Integer> list = new ArrayList<>();
      if(root==null)    return list;
        
      Stack<TreeNode> st = new Stack<>();
       TreeNode cur = root;
      while(!st.isEmpty()||cur!=null){
      //一边向左遍历,一边将遍历到的节点入栈
          while(cur!=null){
              st.push(cur);
              cur = cur.left;	//左
          }
          cur = st.pop();
          //存储遍历结果
          list.add(cur.val);	//根
          cur = cur.right;		//右
      }
      return list;
    }
}

前序遍历和中序遍历的代码基本相同,但是后序遍历与它们不太一样

后序遍历

//非递归
//左 右 根
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
     List<Integer> list = new ArrayList<>();
     if(root==null) return list;
     TreeNode cur = root;
     
     //关键在于定义一个cur的前驱节点
     TreeNode pre = null;
     Stack<TreeNode> st = new Stack<>();
     while(cur!=null||!st.isEmpty()){
     
     	//一边向左遍历,一边将遍历到的节点入栈
         while(cur!=null){
             st.push(cur);
            cur = cur.left;
         }
         cur = st.pop();
         //若该节点的右节点为空,或者右节点被遍历过,数组才能存储该节点的数值(也就是我们最后才遍历的根)
         if(cur.right==null||cur.right==pre){
             list.add(cur.val);
             pre = cur;
             cur=null;
         }else{//如果不满足,说明该节点的右节点还没有被遍历过,那么接着向右子节点遍历
             st.push(cur);
             cur=cur.right;
         }
     }
     return list;
    }
}

点击全文阅读


本文链接:http://zhangshiyu.com/post/30547.html

遍历  节点  子树  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 当女配看见弹幕后,被病娇男主强制爱了续集(裴纪洲江柠)_当女配看见弹幕后,被病娇男主强制爱了续集(裴纪洲江柠)
  • 「都市:比悍匪还猛,你管这叫警察?」章节限时抢先看‌_[苏浩]精彩章节免费试读
  • [乖乖女甜又野,偏执贺总失控沦陷]全集阅读_「温黎贺行舟」完结版免费阅读
  • 当女配看见弹幕后,被病娇男主强制爱了+结局+番外(裴纪洲江柠)列表_当女配看见弹幕后,被病娇男主强制爱了+结局+番外
  • 沈青禾霍沉洲+后续+结局(沈青禾霍沉洲)列表_沈青禾霍沉洲+后续+结局(沈青禾霍沉洲)全书+后续+结局在线
  • 全文当女配看见弹幕后,被病娇男主强制爱了+结局+番外(裴纪洲江柠)列表_全文当女配看见弹幕后,被病娇男主强制爱了+结局+番外
  • 当女配看见弹幕后,被病娇男主强制爱了结局+番外免费_(裴纪洲江柠)当女配看见弹幕后,被病娇男主强制爱了结局+番外列表_笔趣阁(裴纪洲江柠)
  • 当女配看见弹幕后,被病娇男主强制爱了+后续+结局(裴纪洲江柠)_(当女配看见弹幕后,被病娇男主强制爱了+后续+结局)列表_笔趣阁(裴纪洲江柠)
  • 全文桃花依然笑春风(陆乘渊云梵音)列表_全文桃花依然笑春风
  • 半是风雨半是霜全书+后续+结局(顾宴辞宋相欢)免费_(半是风雨半是霜全书+后续+结局)顾宴辞宋相欢列表_笔趣阁(顾宴辞宋相欢)
  • 人面桃花长相忆+后续+结局(阮雾梨闻砚辞阮见微)_(人面桃花长相忆+后续+结局)列表_笔趣阁(阮雾梨闻砚辞阮见微)
  • (沈意眠段钦言初见乍惊欢结局+番外)(初见乍惊欢沈意眠段钦言结局+番外)列表_笔趣阁

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1