zoukankan      html  css  js  c++  java
  • 数据结构与算法 —— 二叉树 01

    上节介绍了二叉树的一些基本概念,这篇文章开始,我们开始学习二叉树的一些算法问题,今天先看一些层次遍历的题目。

     二叉树的层次遍历

    题目

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

    例如:
    给定二叉树: [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回其层次遍历结果:

    [
      [3],
      [9,20],
      [15,7]
    ]

    解题思路

    维护一个list,list里面是当前层次的节点的集合。然后循环list,把下个层次的节点再加入到list中去,直到list为空。

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def levelOrder(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            res = []
            if root is None:
                return res
            q = []
            q.append(root)
            while len(q) != 0:
                temp = []
                length = len(q)
                for i in range(length):
                    r = q.pop(0)
                    if r.left:
                        q.append(r.left)
                    if r.right:
                        q.append(r.right)
                    temp.append(r.val)
                res.append(temp)
            return res
                    
    

     二叉树的层次遍历II

    题目

    给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

    例如:
    给定二叉树 [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回其自底向上的层次遍历为:

    [
      [15,7],
      [9,20],
      [3]
    ]

    解题思路

    和上道题的思路是一致的,只是在生成结果的时候把数据插入到最前面,用到list的insert方法。

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def levelOrderBottom(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            res = []
            if not root:
                return res
            q = []
            q.append(root)
            while len(q) > 0:
                temp =[]
                length = len(q)
                for i in range(length):
                    node = q.pop(0)
                    if node.left:
                        q.append(node.left)
                    if node.right:
                        q.append(node.right)
                    temp.append(node.val)
                res.insert(0,temp)
            return res
        
    

      

    二叉树的最小深度

    题目

    给定一个二叉树,找出其最小深度。

    最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

    说明: 叶子节点是指没有子节点的节点。

    示例:

    给定二叉树 [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7

    返回它的最小深度  2.

    解题思路

    和前面的解题思路基本一致,就是要再维护一个int的deep记录最小的深度,当左右节点都为空的时间,直接就可以返回了。

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def minDepth(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            if not root:
                return 0
            q=[]
            q.append(root)
            deep = 0
            while len(q)!=0:
                deep +=1
                length = len(q)
                for i in range(length):
                    node = q.pop(0)
                    if not (node.left or node.right):
                        return deep
                    else:
                        if node.left:
                            q.append(node.left)
                        if node.right:
                            q.append(node.right)
    

      

    总结一波:对于二叉树的层次遍历,只要一直维护当前层次的node的list就好了。感觉最重要的事情就是这样。

    coding交流群:226704167,愿和各位一起进步!

    微信公众号:

  • 相关阅读:
    《一网打尽》:贝佐斯粗暴刻薄,商业战略上的几次成功决策造了今天的亚马逊
    《信息简史》:计算机史前史
    《孵化Twitter》:Twitter创始人勾心斗角史,细节披露程度令人吃惊
    《走出电商困局》:与《我看电商》有不少重复,反复强调电商要重视成本
    转贴健康资讯:感冒了,是因为着凉吗?
    《众病之王》:人类探索癌症诊断治疗的历史
    转发健康资讯:寒冷会导致关节炎吗?
    《淘宝十年产品事》淘宝产品演进史及作者的思考
    [React] How to use a setState Updater Function with a Reducer Pattern
    [HTML5] Text Alternatives
  • 原文地址:https://www.cnblogs.com/lip0121/p/9116537.html
Copyright © 2011-2022 走看看