145.二叉树的后序遍历

【LetMeFly】145.二叉树的后序遍历:二叉树必会算法-递归/迭代(栈模拟递归)

力扣题目链接:https://leetcode.cn/problems/binary-tree-postorder-traversal/

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

 

示例 1:

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

 

提示:

  • 树中节点的数目在范围 [0, 100]
  • -100 <= Node.val <= 100

 

进阶:递归算法很简单,你可以通过迭代算法完成吗?

方法一:深度优先搜索DFS(递归)

在学习后序遍历之前,有必要先了解以下前序遍历

可以参考题解:https://letmefly.blog.csdn.net/article/details/126057536

后序遍历于前序遍历的不同之处在于,后序是先遍历左子树和右子树,再遍历根节点的值。

因此,我们只需要把前序遍历代码中遍历根节点的顺序,调整到遍历左右子树节点 之后即可。

前序遍历核心代码:

1
2
3
4
// 先根再左右子
ans.push_back(root->val);
dfs(root->left);
dfs(root->right);

后续遍历核心代码:

1
2
3
4
// 先左右子再根
dfs(root->left);
dfs(root->right);
ans.push_back(root->val);

同理,中序遍历核心代码:

1
2
3
4
// 左子 根 右子
dfs(root->left);
ans.push_back(root->val);
dfs(root->right);
  • 时间复杂度$O(N)$,其中$N$是二叉树节点的个数
  • 空间复杂度$O(N)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
private:
vector<int> ans;

void dfs(TreeNode* root) {
if (!root)
return;
dfs(root->left);
dfs(root->right);
ans.push_back(root->val);
}
public:
vector<int> postorderTraversal(TreeNode* root) {
dfs(root);
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# from typing import List, Optional

# # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right

class Solution:
def dfs(self, root: Optional[TreeNode]) -> None:
if not root:
return
self.dfs(root.left)
self.dfs(root.right)
self.ans.append(root.val)

def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
self.ans = []
self.dfs(root)
return self.ans

方法二:使用栈模拟递归(栈模拟递归)

使用栈模拟递归,具体做法可参考94. 中序遍历

与之不同的是,出栈顺序应该是左子右子根,因此入栈顺序为根右子左子。

  • 时间复杂度$O(N)$,其中$N$是二叉树节点的个数
  • 空间复杂度$O(N)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
stack<pair<TreeNode*, bool>> st;
st.push({root, false});
while (st.size()) {
auto [thisNode, ifPushed] = st.top();
st.pop();
if (!thisNode) {
continue;
}
if (ifPushed) {
ans.push_back(thisNode->val);
}
else {
st.push({thisNode, true});
st.push({thisNode->right, false});
st.push({thisNode->left, false});
}
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# from typing import List, Optional

# # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right

class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
ans = []
st = [(root, False)]
while st:
thisNode, ifPushed = st.pop()
if not thisNode:
continue
if ifPushed:
ans.append(thisNode.val)
else:
st.append((thisNode, True))
st.append((thisNode.right, False))
st.append((thisNode.left, False))
return ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126057794


145.二叉树的后序遍历
https://blog.letmefly.xyz/2022/07/29/LeetCode 0145.二叉树的后序遍历/
作者
Tisfy
发布于
2022年7月29日
许可协议