题解 | #实现二叉树先序,中序和后序遍历#

实现二叉树先序,中序和后序遍历

http://www.nowcoder.com/practice/a9fec6c46a684ad5a3abd4e365a9d362

非递归算法Java语言版

import java.util.*;

/*

  • public class TreeNode {
  • int val = 0;
  • TreeNode left = null;
  • TreeNode right = null;
  • } */

public class Solution { /** * * @param root TreeNode类 the root of binary tree * @return int整型二维数组 */

ArrayList<Integer> list1=new ArrayList<Integer>();
ArrayList<Integer> list2=new ArrayList<Integer>();
ArrayList<Integer> list3=new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
public int[][] threeOrders (TreeNode root) {
    // write code here 用递归实现,前序,中序,后续,本次采用非递归方法实现
    
    preOrder(root);
    inOrder(root);
    postOrder(root);
    res.add(list1);
    res.add(list2);
    res.add(list3);
    int[][] ans=new int[3][list1.size()];
    for(int i=0;i<list1.size();i++){
        ans[0][i]=list1.get(i);
        ans[1][i]=list2.get(i);
        ans[2][i]=list3.get(i);
    }
    return ans;
}
public void preOrder(TreeNode root){
    if(root==null) return;
    LinkedList<TreeNode> list=new LinkedList<>();
    TreeNode p=root;
    list.push(p);
    while(list.size()>0){
        p=list.peek();
        list.pop();
        list1.add(p.val);
        if(p.right!=null) list.push(p.right);
        if(p.left!=null) list.push(p.left);
    }
    return;
}
public void inOrder(TreeNode root){
    if(root==null) return;
    LinkedList<TreeNode> list=new LinkedList<>();
    TreeNode p=root;
    while(list.size()>0||p!=null){
        while(p!=null){
            list.push(p);
            p=p.left;
        }
        p=list.peek();
        list2.add(p.val);
        list.pop();
        p=p.right;
    }
    return;
}
public void postOrder(TreeNode root){
    if(root==null) return;
    LinkedList<TreeNode> list=new LinkedList<>();
    TreeNode p=root,last=null;
    while(list.size()>0||p!=null){
        while(p!=null){
            list.push(p);
            p=p.left;
        }
        p=list.peek();
        if(p.right==null||last==p.right){
            list.pop();
            list3.add(p.val);
            last=p;
            p=null;
        }else{
            p=p.right;
        }
   }
   return;
}

}

全部评论

相关推荐

1.&nbsp;多做一劳永逸的事情。很多事情一次学会基本可以大学四年都不再为这类事情发愁。小的比如学会markdown,记笔记就变得方便快捷;大的比如自己经常要发布上线服务,就花几天搭建一个集群。2.&nbsp;时刻具备3-7天掌握一项技能的心理准备。无论是学科竞赛、期末考试,还是准备实习、秋招,很多时候当你需要快速运用某项技能做事的时候,不会有那么多时间给你准备,这时候就需要速成。3.&nbsp;加入/组建一个技术团体,社团/面试群/社群/技术博主的圈子,并且养成水群习惯。只有你参与并融入你正在追求的事业的氛围里,你才能保持动力去做一件事。推荐一个博主【程序员牛肉】的圈子:https://pd.qq.com/s/daelsgft54.&nbsp;尽早明确自己距离目标还差什么。很多人学习的非常努力,但是方向不明确。最简单的例子,很多我帮忙找实习秋招的朋友,简历都过不了,却花大把时间在背八股上。面试的过程是阶段性的,要考虑的先是有面试机会、再是怎么面试。5.&nbsp;思维不要被约束。后端语言java、c++可以,golang也可以;项目苍穹外卖、黑马点评可以,github上的高star项目也可以;数据库用mysql、redis可以,用postgresql也可以;项目里的ai模块用rag、mcp可以,最简单的function&nbsp;call也可以。帮很多人看简历问题的时候,很多东西都是硬写上去的,项目是自己的,不是非要和网上大流一致才是好项目。
想进开水团喝开水:杭电也是双非是吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务