LeetCode题解-145-Binary Tree Postorder Traversal

来源:互联网 发布:定位寻人软件 编辑:程序博客网 时间:2024/06/03 20:09

尽管写LeetCode解答主要是为了自己整理思路,但是如果对您也正好有帮助,请点个赞给菜鸟一点鼓励吧 :-)

原题



解法概览

解法1为递归;

解法2位迭代。


解法1

解题思路

递归法。后序遍历左子树,后序遍历右子树,访问根节点。

代码

public class Solution145_recursive {    public List<Integer> postorderTraversal(TreeNode root) {        ArrayList<Integer> treeValList = new ArrayList<Integer>();        if (root == null)            return treeValList;        ArrayList<Integer> leftTreeValList = (ArrayList<Integer>) postorderTraversal(root.left);        ArrayList<Integer> rightTreeValList = (ArrayList<Integer>) postorderTraversal(root.right);        treeValList.addAll(leftTreeValList);        treeValList.addAll(rightTreeValList);        treeValList.add(root.val);        return treeValList;    }}


解法2

解题思路

1)当栈顶指针非空,应遍历左子树(遍历时不访问节点)
2)若从左子树返回,如果当前节点的右子树为空或者已被访问,那么右子树进栈,否则出栈,访问该节点。

图解

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


代码

<pre name="code" class="java">public class Solution145_iterator {    public List<Integer> postorderTraversal(TreeNode root) {        Stack<TreeNode> treeNodeStack = new Stack<TreeNode>();        ArrayList<Integer> treeNodeList = new ArrayList<Integer>();        treeNodeStack.push(root);        TreeNode lastVisit = null;        while (!treeNodeStack.empty()){            while (treeNodeStack.peek() != null){                TreeNode currentNode = treeNodeStack.peek();                treeNodeStack.push(currentNode.left);            }            treeNodeStack.pop();            if (!treeNodeStack.isEmpty()){                TreeNode currentNode = treeNodeStack.peek();                if (currentNode.right == null || currentNode.right == lastVisit){                    lastVisit = treeNodeStack.pop();                    treeNodeList.add(lastVisit.val);                    treeNodeStack.push(null);                }                else{                    treeNodeStack.push(currentNode.right);                }            }        }        return treeNodeList;    }}


0 0
原创粉丝点击