[LeetCode] 145. Binary Tree Postorder Traversal Java
题目:
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3},
1
\
2
/
3
return [3,2,1].
题意及分析:后序遍历,先遍历左子节点,然后右子节点,最后才遍历该点。这里对于任意一个节点,如果当前点没有子节点或者 已经访问过存在的子节点,那么可以直接访问该点,并输出该点的值;否则访问该点的子节点。如果用一个栈来实现,那么先从根节点起遍历,如果节点无左右子树或者已经访问过那么直接输出节点的值,否则将该点的右子节点和左子节点先后加入栈中,这样就可以保证先输出左子节点后输出右子节点。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
stack.push(root);
TreeNode preNode=null;
while(!stack.isEmpty()&&root!=null){
root=stack.peek(); //得到栈顶的点
//如果当前节点没有子节点 或者 当前节点的左右子树都被访问,那么可以直接输出该点的值并从栈中弹出该点
if((root.left==null&&root.right==null)||(preNode!=null&&(root.left==preNode||root.right==preNode))){
root=stack.pop();
res.add(root.val);
preNode=root;
}else{ //同时访问该点的右子节点和左子节点,保证先输出左后输出右
if(root.right!=null){
stack.push(root.right);
}
if(root.left!=null){
stack.push(root.left);
}
}
}
return res;
}
}
方法二:
public ArrayList<Integer> postorderTraversal(TreeNode root) { //使用非递归实现后序遍历 ArrayList<Integer> result = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; while(!stack.isEmpty() || node !=null){ if(node!=null){ //入栈的时候添加 stack.push(node); result.add(node.val); node = node.right; }else{ node=stack.pop(); node=node.left; } } Collections.reverse(result); return result; }

浙公网安备 33010602011771号