1.题目描述
2.思路
(1)二叉树后序遍历:左右根
(2)根节点的压入:
根节点首先被压入stack中,然后被弹出并压入output中。
遍历过程:
stack用于存储需要遍历的节点。
output用于反转遍历顺序。
入栈顺序:
左子节点先入栈,右子节点后入栈。这样出栈顺序是右-左。
构建结果:
将output中的节点依次弹出并存入结果列表result中,这样得到的顺序就是后序遍历(左-右-根)。
3.代码实现
/*** 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> result=new ArrayList<>();if(root==null){return result;}Stack<TreeNode> stack=new Stack<>();//初始化一个空栈stack.push(root);//将根节点的内容压入栈中,比如root = [1,null,2,3]//辅助栈,用户反转遍历顺序。反转是根右左,正确的是左右根。Stack<TreeNode> output=new Stack<>();while(!stack.isEmpty())//当栈不空的时候{TreeNode current=stack.pop();//将栈中当前值弹出output.push(current);//将当前节点推入栈//入栈先左后右,出栈先右后左if(current.left!=null) //根右左{stack.push(current.left);}if(current.right!=null){stack.push(current.right);}}while(!output.isEmpty()){result.add(output.pop().val);//弹出的顺序正好是左右根}return result;}
}