一周编程集训day4:二叉树

1 任务

二叉树:学习三种遍历(前、中、后)及层次遍历,并完成leetcode上的验证二叉搜索树(98)及二叉树 层次遍历(102,107)!并同时温习前三天内容,做出总结!

2 概念介绍

  1. 二叉树概念:一棵二叉树是结点的一个有限集合。该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树组成。
    一周编程集训day4:二叉树
  • 满二叉树:除了最后一层的节点无任何子节点外,剩下的每一层上的节点都有两个子节点。
    一周编程集训day4:二叉树
  • 完全二叉树:除了最后一层之外,其他每一层的节点数都是满的,最后一层如果也是满的,则是一棵满二叉树,也是完全二叉树。最后一层如果不满,则缺少的节点也全部都集中在右边,那也是一棵完全二叉树。
    一周编程集训day4:二叉树判断是否是完全二叉树的步骤:
    1)层序遍历二叉树;
    2)如果存在一个节点的右子树存在而左子树不存在,则直接返回false
    3)如果当前节点的左子树和右子树不同时存在,则其后的节点的左右子树均不存在,如果存在,则直接返回false
    4)如果顺利遍历结束,则直接返回true
  1. 二叉树的遍历:遵循某种次序,遍历二叉树中的所有节点,使得每个结点被访问一次,而且仅访问一次。“访问”:即对结点施行某些操作。二叉树的遍历有四种顺序。
    1)先序遍历:先访问根结点,再访问左子树,最后访问右子树。
    2)中序遍历:先访问左子树,再访问根结点,最后访问右子树。
    3)后序遍历:先访问左子树,再访问右子树,最后访问根结点。
    4)层次遍历:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。

3 leetcode

  1. 98.验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
    2
   / \
  1   3
输出: true
示例 2:
输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

python解答思路:用递归的思想解决。如果节点为空,则返回True。若左子树不空的时候,其根结点大于左子树的最大值,左子树返回为真且右子树也为真则返回真;考虑右子树时,根要比右子树的最小值小。

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.valid(root, None, None)
 
    def valid(self, root, min, max):
        if root == None or root.val == None:
            return True
 
        if (min is not None and root.val <= min) or (max is not None and root.val >= max):
            print(1)
            return False
 
        return self.valid(root.left, min, root.val) and self.valid(root.right, root.val, max)

leetcode提交结果:
一周编程集训day4:二叉树
2. 102.二叉树的层次遍历

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

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

python解答思路:用深度优先搜索(DFS),节点的深度与输出结果数组的下标相对应。

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        res = [] 
        self.dfs(root, 0, res) 
        return res 
    def dfs(self, root, depth, res): 
        if root == None: 
            return res 
        if len(res) < depth+1: 
            res.append([]) 
        res[depth].append(root.val) 
        self.dfs(root.left, depth+1, res) 
        self.dfs(root.right, depth+1, res)

leetcode提交结果:
一周编程集训day4:二叉树
3. 107. 二叉树的层次遍历 II

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

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

python解答思路:采用层次遍历法,并翻转。

class Solution(object):
    def help(self, root, level, ans):
        if root:
            if len(ans) < level + 1:
                ans.append([])
            ans[level].append(root.val)
            self.help(root.left, level + 1, ans)
            self.help(root.right, level + 1, ans)
 
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        ans = []
        self.help(root, 0, ans)
        ans.reverse()
        return ans  

leetcode提交结果:
一周编程集训day4:二叉树

4 参考

  1. 参考1
  2. leetcode代码参考

分类:

技术点:

相关文章: