Binary Tree Postorder Traversal 二叉树后序遍历
后序遍历是啥就不说了,百度一下, 简单说就是 left_child->right_child->root.
Input: root = [1,null,2,3]
Output: [3,2,1]
思路
递归处理
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> list = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if(root==null){
return list;
}
postorderTraversal(root.left);
postorderTraversal(root.right);
list.add(root.val);
return list;
}
}
非递归的方式
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans =new ArrayList<>();
Stack<Integer> s2 = new Stack<Integer>();//记录遍历方向
Stack<TreeNode> s1 = new Stack<TreeNode>();//记录treenode轨迹
if(root==null){
return ans;
}
s1.push(root);
s2.push(0);
while(!s1.isEmpty()){
root = s1.peek();
int status = s2.pop();
switch (status){
case 0://左
s2.push(1);
if(root.left!=null){
s1.push(root.left);
s2.push(0);
}
break;
case 1://右
s2.push(2);
if(root.right!=null){
s1.push(root.right);
s2.push(0);
}
break;
case 2://root
ans.add(s1.peek().val);
s1.pop();
}
}
return ans;
}
}
Tag
stack