LeetCode 145 二叉树的后序遍历
程序员文章站
2022-05-20 13:46:25
...
给定一个二叉树,返回它的 后序 遍历。
非递归:
通过记录上一次遍历的节点。
如果当前节点的右节点和上一次遍历的节点相同,那就表明当前是从右节点过来的了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> lst=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=root;
TreeNode last=null;
while(cur!=null||!stack.isEmpty()){
if(cur!=null){
stack.push(cur);
cur=cur.left;
}
else{
TreeNode temp=stack.peek();
if(temp.right!=null&&temp.right!=last){
cur=temp.right;
}
else{
lst.add(temp.val);
last=temp;
stack.pop();
}
}
}
return lst;
}
}
另一种非递归解法:
从根节点开始依次迭代,弹出栈顶元素输出到输出列表中,然后依次压入它的所有孩子节点,按照从上到下、从左至右的顺序依次压入栈中。
因为深度优先搜索后序遍历的顺序是从下到上、从左至右,所以需要将输出列表逆序输出
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) {
return output;
}
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pollLast();
output.addFirst(node.val);
if (node.left != null) {
stack.add(node.left);
}
if (node.right != null) {
stack.add(node.right);
}
}
return output;
}
}
递归:
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
postorderTraversalHelper(root, list);
return list;
}
private void postorderTraversalHelper(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
postorderTraversalHelper(root.left, list);
postorderTraversalHelper(root.right, list);
list.add(root.val);
}
下一篇: 112. 路径总和