我的个人微信公众号:Microstrong
微信公众号ID:MicrostrongAI
微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!
知乎主页:https://www.zhihu.com/people/MicrostrongAI/activities
145. Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input: [1,null,2,3] 1 \ 2 / 3 Output: [3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
解题思路:
(1)递归解法
from typing import List
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if root is None:
return []
res = []
def postorder(root, res):
if root is None:
return res
postorder(root.left, res)
postorder(root.right, res)
res.append(root.val)
postorder(root, res)
return res
if __name__ == "__main__":
root = TreeNode(1)
level1_right = TreeNode(2)
level2_left = TreeNode(3)
root.right = level1_right
level1_right.left = level2_left
sol = Solution()
print(sol.postorderTraversal(root))
(2)迭代解法1
按照根节点,左节点,右节点的顺序入栈,然后逐个添加到res的头部。
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if root is None:
return []
res = list()
stack = [root]
while stack:
node = stack.pop()
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
res.insert(0, node.val)
return res
(3)迭代解法2
既然后序遍历的顺序是左右中,那么自然地想,可不可以先算出中右左的遍历,然后逆转结果得到后序遍历的结果呢。
测试发现是可行的,以下代码是在【LeetCode】144. Binary Tree Preorder Traversal 的基础上修改的。
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return res[::-1]