LeetCode---二叉树前中后序遍历

前言

之前几篇文章都是按照一个同学给的Word敲的,顺序也是链表开始,我敲的都是简单题。今天发现了一个博主,打算按照他的顺序来,再加上他有相应的解释。所以今天更一下学到的二叉树模板和学的第一个数组代码。


问题

二叉树的前序、中序、后序遍历。

思路分析

LeetCode上说递归比较简单(虽然我还没有敲过递归的答案),就先学习了迭代的模板。说解释,我看了视频解释也不是很懂,但是记住了关键的几行代码。

代码如下:

//前序遍历---根左右
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
         LinkedList<Integer> list = new LinkedList<Integer>();//通用的放值列表
         Stack<TreeNode> stack = new Stack<TreeNode>();//栈
         while(root != null || !stack.isEmpty()){//这两个while我也不是很理解,我记的时候就是“root”和stack只要有一个不为空,就要“战斗”下去
             while(root != null){
                 list.add(root.val);//关键代码1,添加值
                 stack.push(root);//关键代码2,结点放到栈内
                 root = root.left;//关键代码3,顺着left一直往下
             }
             TreeNode cur = stack.pop();//关键代码4,上面left到没有之后,栈出值
             root = cur.right;//关键代码5,开始right,往右
         }
         return list;
    }
}
//后序遍历----左右根
        Stack<TreeNode> stack = new Stack<>();
        LinkedList<Integer> list = new LinkedList<>();
        while (!stack.isEmpty() || root != null) {
            while (root != null) {
                list.add(root.val);//关键代码1
                stack.push(root);//关键代码2
                root = root.right;//关键代码3,这个地方注意,前序是一直left,后序是一直right,往右
            }
            TreeNode cur = stack.pop();//关键代码4
            //root = stack.pop();
            root = cur.left;//关键代码5,前面往右,现在就要往左了。(简单记:前序是左右,后序是右左)
        }
        Collections.reverse(list);//一定要反转!!!!不然输出的list可不对啊!!
        return list;

//中序遍历---左根右
        LinkedList list = new LinkedList();
        Stack stack = new Stack();
        while(root != null || !stack.isEmpty()){
            while(root != null){
                stack.push(root); //依然的放到栈里
                root = root.left;//先左,下面的往右,“左右”
            }
            TreeNode cur = stack.pop();//依然来一个cur临时变量
            list.add(cur.val);//在这个地方把值放进list
            root = cur.right;//右
        }
        return list;

模板的几行关键代码,就,,记住。
再来放一下中序递归的代码。

class Solution{
     public List<Integer> inorderTraversal(TreeNode root){
                List<Integer> res = new ArrayList<Integer>();
                inorder(root, res);
                return res;
       }
       public void inorder(TreeNode root, List<Integer> res){
                if(root == null){
                return ;
                }
                inorder(root.left, res);//左
                res.add(root.val);//中
                inorder(root.right, res);//右
        }
}

你可能感兴趣的:(Leetcode,java,数据结构,leetcode)