二叉树的遍历

1. 树的遍历

前序遍历

前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。


image.png

中序遍历

中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。


image.png

通常来说,对于二叉搜索树,我们可以通过中序遍历得到一个递增的有序序列

后序遍历

后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。


image.png

2. 递归

使用递归方法时,只需更改获取root.val的位置。

前序遍历

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        self.res = []
        return self.preorder(root)
        
    def preorder(self, root):
        if not root: return []
        # 前序:root -> left -> right
        self.res.append(root.val) 
        self.preorder(root.left)
        self.preorder(root.right)
        return self.res

中序遍历

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        self.res  = []
        return self.inorder(root)
    
    def inorder(self, root):
        if not root: return []
        # 中序: left -> root -> right
        self.inorder(root.left)
        self.res.append(root.val)
        self.inorder(root.right)
        return self.res 

后序遍历

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        self.res  = []
        return self.postorder(root)
    
    def postorder(self, root):
        if not root: return []
        # 后序: left -> right -> root 
        self.postorder(root.left)
        self.postorder(root.right)
        self.res.append(root.val)
        return self.res

3. 迭代

第一种模板

前序遍历

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        stack = [root]
        res = []
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.right:
                stack.append(node.right)            
            if node.left:
                stack.append(node.left)    
        return res

后序遍历

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        stack = [root]
        res = []
        while stack:
            node = stack.pop()
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
            res.append(node.val)
        return res[::-1]  # 逆序输出

中序遍历

中序遍历最常用模板

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        res = []
        stack = []
        node = root
        while node or stack:
            while node:
                stack.append(node)
                node = node.left
            node = stack.pop()
            res.append(node.val)
            node = node.right
        return res

第二种模板

class Solution:
    # 前序遍历
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        node = root 
        stack = []
        res = []
        while node or stack:
            while node:
                res.append(node.val)
                stack.append(node)
                node = node.left # <- left
            node = stack.pop()
            node = node.right # <- right
        return res 

    # 后序遍历
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        node = root
        stack = []
        res = []
        while node or stack:
            while node:
                res.append(node.val)
                stack.append(node)
                node = node.right # <- right
            node = stack.pop()
            node = node.left # <- left
        return res[::-1] # 同样需要逆序输出

    # 中序遍历
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root: return []
        node = root
        stack = []
        res = []
        while node or stack:
            while node:
                stack.append(node)
                node = node.left
            node = stack.pop()
            res.append(node.val)
            node = node.right
        return res
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。