LeetCode题解-144-Binary Tree Preorder Traversal

来源:互联网 发布:网络舆情引导机制 编辑:程序博客网 时间:2024/05/20 13:41
尽管写LeetCode解答主要是为了自己整理思路,但是如果对您也正好有帮助,请点个赞给菜鸟一点鼓励吧 :-)

原题



解法概览

本题共有两种解法,1种递归,1种迭代。

前序遍历:1)访问根节点;2)前序遍历左子树;3)前序遍历右子树。


解法1

解法分析

递归法。访问根节点,递归访问左子树,递归访问右子树。


代码

public class Solution144_Recursive {    public List<Integer> preorderTraversal(TreeNode root) {        ArrayList<Integer> allList = new ArrayList<Integer>();        if (root == null)            return allList;        ArrayList<Integer> leftChildList = (ArrayList<Integer>)preorderTraversal(root.left);        ArrayList<Integer> rightChildList = (ArrayList<Integer>)preorderTraversal(root.right);        allList.add(root.val);        allList.addAll(leftChildList);        allList.addAll(rightChildList);        return allList;    }}

解法2

解法分析

1)当栈顶指针非空,应遍历左子树(遍历时直接访问节点,与中序遍历不同)
2)若栈顶指针为空,则退回上一层,若从左子树返回,则访问当前层的的根节点,若从右子树返回,则访问当前层的遍历结束,继续退栈;


图解

看不清图的话可以在浏览器 页面中单独打开。



代码

public class Solution144_iterator {    public List<Integer> preorderTraversal(TreeNode root) {        Stack<TreeNode> treeNodeStack = new Stack<TreeNode>();        ArrayList<Integer> treeValList = new ArrayList<Integer>();        treeNodeStack.push(root);        while (!treeNodeStack.empty()){            //从根节点访问到最左的节点            while (treeNodeStack.peek() != null){                TreeNode currentNode = treeNodeStack.peek();                treeValList.add(currentNode.val);                treeNodeStack.push(currentNode.left);            }            treeNodeStack.pop();            if (!treeNodeStack.empty()){                TreeNode currentNode = treeNodeStack.pop();                treeNodeStack.push(currentNode.right);            }        }        return treeValList;    }}


0 0