二叉树的非递归遍历1

6.10
非递归遍历法本质就是用堆栈

  1. 后输出的先压入,先输出的后压入
  2. 弹出操作伴随着值的记录
  3. 编程的关键是搞清楚每个节点何时压入,何时弹出

前序:
逻辑就是弹出当前节点,记录中值,然后压入当前节点的右节点和左节点即可

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:  
            return []

        keeper = []  # 保存结果
        stack = []  # 堆栈
        stack.append(root) # 送入根节点
        while stack:
            # 弹出当前要处理的节点
            node = stack.pop()
            if not node:
                continue
            # 空节点就不再处理
            keeper.append(node.val)
            stack.append(node.right)
            stack.append(node.left)
        
        return keeper

后序:
按照中右左的思路套用前序(中左右)的代码,处理完后反转过来就是左右中即(后续)

# 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]:
        if not root:  
            return []

        keeper = []  # 保存结果
        stack = []  # 堆栈
        stack.append(root) # 送入根节点
        while stack:
            # 弹出当前要处理的节点
            node = stack.pop()
            if not node:
                continue
            # 空节点就不再处理
            keeper.append(node.val)
            stack.append(node.left)
            stack.append(node.right)

        return keeper[::-1]

中序
当指针cur指向的节点不是None时,保存该节点,并将cur指向该节点左侧子节点
当指针cur指向的节点是None时,将指针指向堆栈的节点,弹出堆栈的顶部,保存该节点的val,并将指针指向该节点的右侧

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack = []  # 不能提前将root结点加入stack中
        result = []
        cur = root
        while cur or stack:
            # 先迭代访问最底层的左子树结点
            if cur:     
                stack.append(cur)
                cur = cur.left		
            # 到达最左结点后处理栈顶结点    
            else:		
                cur = stack.pop()
                result.append(cur.val)
                # 取栈顶元素右结点
                cur = cur.right	
        return result

你可能感兴趣的:(Notes,of,Leetcode,python,开发语言)