尽管写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;
}
}