提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
二叉树的后序遍历
一、递归法
解题思路
根据左子树、右子树、根节点的顺序递归调用自己。递归终止条件是节点为空
代码如下:
/**
* 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 {
List<Integer> res = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
//递归法,遍历规则为:先左节点,再右节点,最后根节点
if(root != null){
postorderTraversal(root.left);
postorderTraversal(root.right);
res.add(root.val);
}
return res;
}
}
二、迭代法
解题思路
用栈来实现与递归类似的作用。
注意:后序遍历和前序遍历有联系。前序遍历为根、左、右的访问方式,首先将代码变换一下变成根、右、左的遍历规则,随后,对得到的结果进行翻转即获得左、右、中的结果,该结果就是后序遍历的结果。
1、创建一个栈对象;
2、首先将根节点入栈;
3、开启循环,循环进行的条件为栈非空;
4、进行出栈操作;
5、对拿出来的栈顶节点的val值进行保存;
6、先判断当前节点的左节点是否存在,存在则该左节点入栈;
7、再判断当前节点的右节点是否存在,存在则该右节点入栈;
8、循环结束;
9、对保存的结果进行翻转操作。
代码如下:
/**
* 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 {
List<Integer> res = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if(root == null){
return new ArrayList();
}
//迭代法,遍历规则为:先左节点,再右节点,最后根节点
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
res.add(node.val);
if(node.left != null){
stack.push(node.left);
}
if(node.right != null){
stack.push(node.right);
}
}
Collections.reverse(res);
return res;
}
}
总结
暂时没有总结,待续。。。