给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
思路:
迭代法的思路是,使用栈,一层一层的将树节点遍历入栈。
比如下面这个树,使用迭代法,1)第一层,让根节点入栈。2)第二层,弹出第一层的节点,让第一层的孩子入栈(先左再右)。3)第三层,依次弹出第二层元素,让其子节点入栈。
结果为,第一步:5入栈,出栈,result中存储5;
第二步:4,6依次入栈;6无子节点,所有6出栈,result中存储6;
第三步:4出栈,result存储4。同时,4的子节点1、2先后入栈。因为这两个子节点都无孩子节点,所有2,1出栈,result中存储2,1。
至此,result中存储值为5、6、4、2、1;
翻转后为1,2,4,6,5
//后序遍历
//迭代法:重复执行一段代码来求解
//利用栈,先将根节点的右孩子放进栈,再将左孩子放进栈
public static List<Integer> postorderTraversal(TreeNode root){
List<Integer> result=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
if(root!=null){
stack.push(root);
}
while (!stack.empty()){
TreeNode node=stack.pop(); //取栈顶元素
result.add(node.val);
if(node.left!=null){
stack.push(node.left); //左节点入栈
}
if(node.right!=null){
stack.push(node.right); //右节点入栈
}
}
Collections.reverse(result); //翻转List
return result;
}