zoukankan      html  css  js  c++  java
  • 二叉树遍历

    二叉树遍历

    前序:根左右

    中序:左根右

    后序:左右根

    深度优先

    前序遍历

    144. 二叉树的前序遍历

    给定一个二叉树,返回它的 前序 遍历。

    示例:

    输入: [1,null,2,3]  
       1
        
         2
        /
       3 
    
    输出: [1,2,3]
    
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            res = []
            self.preorder(root,res)
            return res
    
        def preorder(self,root,res):
            if root:
                res.append(root.val)
                if root.left:
                    self.preorder(root.left,res)
                if root.right:
                    self.preorder(root.right,res)
    
    #栈
    #根左右,先将根节点入栈,在依次入右节点、左节点
    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            res = []
            stack = []
            stack.append(root)  #根节点入栈
            while stack:
                root = stack.pop()
                if root:
                    res.append(root.val)
                    stack.append(root.right)
                    stack.append(root.left)
            return res
    
    

    中序遍历

    94. 二叉树的中序遍历

    给定一个二叉树,返回它的中序 遍历。

    示例:

    输入: [1,null,2,3]
       1
        
         2
        /
       3
    
    输出: [1,3,2]
    
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    #递归
    class Solution:
        def inorderTraversal(self, root: TreeNode) -> List[int]:
            res = []
            self.helper(root,res)
            return res
        def helper(self,root,res):
            if root:
                if root.left:
                    self.helper(root.left,res)
                res.append(root.val)
                if root.right:
                    self.helper(root.right,res)
    
    #使用栈
    class Solution:
        def inorderTraversal(self, root: TreeNode) -> List[int]:
            res = []
            stack = []
            cur = root
            while cur or stack:
                while cur:
                    stack.append(cur)
                    cur = cur.left
                cur = stack.pop()
                res.append(cur.val)
                cur = cur.right
            return res
    
    

    后序遍历

    145. 二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历。

    示例:

    输入: [1,null,2,3]  
       1
        
         2
        /
       3 
    
    输出: [3,2,1]
    
    # 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]:
            res = []
            def postorder(root):
                if root:
                    if root.left:
                        postorder(root.left)
                    if root.right:
                        postorder(root.right)
                    res.append(root.val)
            postorder(root)
            return res
    
    #栈
    #根左右  转换为  根右左  逆序为  左右根
    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            if not root:
                return []
            res = []
            stack = []
            stack.append(root)
            while stack:
                root = stack.pop()
                res.append(root.val)
                if root.left:
                    stack.append(root.left)
                if root.right:
                    stack.append(root.right)
            return res[::-1]
    

    广度优先

    层次遍历

    102. 二叉树的层序遍历

    给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

    示例:
    二叉树:[3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回其层次遍历结果:

    [
      [3],
      [9,20],
      [15,7]
    ]
    
    #按照每层遍历
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            res,queue = [],[]
            queue.append([root])
            res.append([root.val])
            while queue:
                root = queue.pop(0)
                level,level_node = [],[]
                for node in root:
                    if node.left:
                        level_node.append(node.left)
                        level.append(node.left.val)
                    if node.right:
                        level_node.append(node.right)
                        level.append(node.right.val)
                if level_node:
                    queue.append(level_node)
                if level:
                    res.append(level)
            return res
    
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            res,queue = [],[]
            queue.append([root])
            level = 0
            while queue:
                root = queue.pop(0)
                res.append([])
                level_node = []
                for node in root:
                    res[level].append(node.val)
                    if node.left:
                        level_node.append(node.left)
                    if node.right:
                        level_node.append(node.right)
                if level_node:
                    queue.append(level_node)
                level += 1
            return res
    
  • 相关阅读:
    an optimal solution to the problem
    sql_action
    rgb转灰度 RGB To Gray php Adobe RGB (1998) [gamma=2.20]
    MTUTCP/IP协议栈linux kernelTCP丢包重传UDP高性能AI ip数据报 tcp数据报
    Metaheuristic
    a computercentered view of information systems to a databasecentered view
    算法 图像识别 搜索
    var wi = 0; wi < arr.length; wi++
    模拟信号 数字信号
    locations in main memory to be referenced by descriptive names rather than by numeric addresses
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12722438.html
Copyright © 2011-2022 走看看