递归

    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, x):
    4. # self.val = x
    5. # self.left = None
    6. # self.right = None
    7. class Solution:
    8. def postorderTraversal(self, root: TreeNode) -> List[int]:
    9. if root is None: return []
    10. return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]

    非递归版本

    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, x):
    4. # self.val = x
    5. # self.left = None
    6. # self.right = None
    7. class Solution:
    8. def postorderTraversal(self, root: TreeNode) -> List[int]:
    9. # 左 - 右 - 根
    10. if not root: return []
    11. stack = []
    12. mark_node = None
    13. ans = []
    14. while root or stack:
    15. if root:
    16. stack.append(root)
    17. root = root.left
    18. elif stack[-1].right != mark_node:
    19. root = stack[-1].right
    20. mark_node = None
    21. else:
    22. mark_node = stack.pop()
    23. ans.append(mark_node.val)
    24. return ans
    1. class Solution:
    2. def postorderTraversal(self, root: TreeNode) -> List[int]:
    3. if root==None:
    4. return []
    5. stack=[root]
    6. res=[]
    7. while stack:
    8. s=stack.pop()
    9. res.append(s.val)
    10. if s.left:#与前序遍历相反
    11. stack.append(s.left)
    12. if s.right:
    13. stack.append(s.right)
    14. return res[::-1]
    15. 作者:harris-han
    16. 链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/python3-er-cha-shu-hou-xu-bian-li-die-dai-fang-fa-/
    17. 来源:力扣(LeetCode
    18. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, x):
    4. # self.val = x
    5. # self.left = None
    6. # self.right = None
    7. class Solution:
    8. def postorderTraversal(self, root: TreeNode) -> List[int]:
    9. res = [] # 用来存储后序遍历节点的值
    10. stack = []
    11. node = root
    12. while stack or node:
    13. while node:
    14. stack.append(node) # 第一次入栈的是根节点
    15. #判断当前节点的左子树是否存在,若存在则持续左下行,若不存在就转向右子树
    16. node = node.left if node.left is not None else node.right
    17. #循环结束说明走到了叶子节点,没有左右子树了,该叶子节点即为当前栈顶元素,应该访问了
    18. node = stack.pop() # 取出栈顶元素进行访问
    19. res.append(node.val) # 将栈顶元素也即当前节点的值添加进res
    20. # (下面的stack[-1]是执行完上面那句取出栈顶元素后的栈顶元素)
    21. if stack and stack[-1].left == node: #若栈不为空且当前节点是栈顶元素的左节点
    22. node = stack[-1].right ## 则转向遍历右节点
    23. else:
    24. node = None # 没有左子树或右子树,强迫退栈
    25. return res
    26. 作者:da-da-meng-yang
    27. 链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/er-cha-shu-de-hou-xu-bian-li-die-dai-fa-by-da-da-m/
    28. 来源:力扣(LeetCode
    29. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, x):
    4. # self.val = x
    5. # self.left = None
    6. # self.right = None
    7. class Solution:
    8. def postorderTraversal(self, root: TreeNode) -> List[int]:
    9. # 左 - 右 - 根
    10. if not root: return []
    11. stack = []
    12. ans = []
    13. while stack or root:
    14. while root:
    15. stack.append(root)
    16. root = root.left if root.left is not None else root.right
    17. root = stack.pop()
    18. ans.append(root.val)
    19. if stack and stack[-1].left == root:
    20. # 栈不为空,且当前节点是栈顶元素的左节点
    21. # 遍历右节点
    22. root = stack[-1].right
    23. else:
    24. root = None # 左右节点都遍历完,强制出栈
    25. return ans