Leetcode.关于树的遍历的一些题目

二叉树的遍历

中序,前序,后序,都是利用栈的思想

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

    输入: [1,null,2,3]
       1
        \
         2
        /
       3
    
    输出: [1,3,2]
    

    树根 - 左子树 - 右子树
    递归实现

    class Solution(object):
        def inorderTraversal(self, root):
            """
            :type root: TreeNode
            :rtype: List[int]
            """
            if root == None:
                return []
            else:
                tree = []
                tree.extend(self.inorderTraversal(root.left))
                tree.append(root.val)
                tree.extend(self.inorderTraversal(root.right))
                return tree
    
  2. 二叉树的前序遍历
    给定一个二叉树,返回它的 前序 遍历。

    输入: [1,null,2,3]  
       1
        \
         2
        /
       3 
    
    输出: [1,2,3]
    

    递归实现:左子树-树根- 右子树

    class Solution(object):
        def preorderTraversal(self, root):
            """
            :type root: TreeNode
            :rtype: List[int]
            """
            
            if root == None:
                return []
            else:
                tree = []
                tree.append(root.val)
                tree.extend(self.preorderTraversal(root.left))
                tree.extend(self.preorderTraversal(root.right))
                return tree
    
  3. 二叉树的后序遍历
    给定一个二叉树,返回它的 后序 遍历。

    输入: [1,null,2,3]  
      1
       \
        2
       /
      3 
    
    输出: [3,2,1]
    

    递归实现:左子树-右子树-树根

    class Solution(object):
       def postorderTraversal(self, root):
           """
           :type root: TreeNode
           :rtype: List[int]
           """
           if root ==None:
               return []
           else:
               tree = []
               tree.extend(self.postorderTraversal(root.left))
               tree.extend(self.postorderTraversal(root.right))
               tree.append(root.val)
               return tree
           
    

层次遍历利用队列的思想

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

    例如:
    给定二叉树: [3,9,20,null,null,15,7],
    
        3
       / \
      9  20
        /  \
       15   7
    返回其层次遍历结果:
    
    [
      [3],
      [9,20],
      [15,7]
    ]
    
    

    思路:

    利用队列的思想
    repeat{
          将树根添加到队列中
          弹出队列的值到输出列表
          添加此树根的左子树和右子树到队列中
     }until 队列为空
    

    python代码

    class Solution(object):
        def levelOrder(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            outlist = []
            if root == None:
                return outlist
            quene = [root]
            while quene:
                res = []
                i = 0
                queneNumber = len(quene)
                while i< queneNumber:
                    point = quene.pop(0)
                    res.append(point.val)
                    if point.left:
                        quene.append(point.left)
                    if point.right:
                        quene.append(point.right)
                    i+=1
                outlist.append(res)
            return outlist
    
  2. 二叉树的层序遍历II
    给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

    例如:
    给定二叉树 [3,9,20,null,null,15,7],
    
        3
       / \
      9  20
        /  \
       15   7
    返回其自底向上的层次遍历为:
    
    [
      [15,7],
      [9,20],
      [3]
    ]
    

    思路:
    与102题类似,最后要返回的是反转后的数组
    python代码:

    class Solution(object):
        def levelOrderBottom(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            if root == None:
                return []
            else:
                quene = [root]
                res = []
                while quene:
                    current = []
                    nodenum = len(quene)
                    for i in range(nodenum):
                        point = quene.pop(0)
                        current.append(point.val)
                        if point.left:
                            quene.append(point.left)
                        if point.right:
                            quene.append(point.right)
                    res.append(current)
                return res[-1::-1]
                        
                
    

N叉树的遍历

N叉树的遍历的思路与二叉树的类似,主不过N叉树的每一个节点有一个chrldren的属性,是列表用于存储节点的多个孩子,加一个for循环即可。

  1. N叉树的层序遍历

    给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

    例如,给定一个 3叉树 :
    在这里插入图片描述
    返回其层序遍历:

    [
    [1],
    [3,2,4],
    [5,6]
    ]

    python代码

    class Solution(object):
        def levelOrder(self, root):
            """
            :type root: Node
            :rtype: List[List[int]]
            """
            if root == None:
                return []
            else:
                res = []
                quene = [root]
                while quene:
                    nodenum = len(quene)
                    current = []
                    for i in range(nodenum):
                        point = quene.pop(0)
                        current.append(point.val)                    
                        for child in point.children:#遍历每一个节点的孩子                       
                            quene.append(child)
                    res.append(current)
                return res
            
    

猜你喜欢

转载自blog.csdn.net/qq_20966795/article/details/85205436