代码随想录算法训练营第二十二天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录

654.最大二叉树

思路

代码

617.合并二叉树

思路

代码

700.二叉搜索树中的搜索

思路

代码

98.验证二叉搜索树

思路

代码


654.最大二叉树

又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历 
思路

        这道题和我们学院自己的OJ上的第一题基本一模一样,就是一直递归,只要坚持左闭右开的原则,问题不大。

代码
from typing import List, Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:
            return None

        max_val = max(nums)
        max_idx = nums.index(max_val)

        root = TreeNode(max_val)

        nums_left = nums[:max_idx]
        nums_right = nums[max_idx+1:]

        root.left = self.constructMaximumBinaryTree(nums_left)
        root.right = self.constructMaximumBinaryTree(nums_right)

        return root



617.合并二叉树

这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。 优先掌握递归。
思路

        不要被一次操作两棵树吓懵了,(虽然我开始也很懵逼),你可以考虑自己新建一棵树或者在原有的树上进行操作。每次无非判断两棵树对应位置的地方是不是None,不是就把两个节点的值相加合并。

代码
from typing import Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if root1 is None and root2 is None:
            return None

        if root1 is not None and root2 is None:
            return root1

        if root1 is None and root2 is not None:
            return root2

        if root1 is not None and root2 is not None:
            root_val = root1.val + root2.val
            root = TreeNode(root_val)

            root.left = self.mergeTrees(root1.left, root2.left)
            root.right = self.mergeTrees(root1.right,root2.right)

        return root

700.二叉搜索树中的搜索

递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性
思路

        咳咳,首先,我写题时没注意看这是二叉搜索树了,(其实是我忘了什么是二叉搜索树了。。。)如果按普通树来写会浪费很多时间。其实递归起来不是很难。

代码
from typing import Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root or root.val == val:
            return root

        if root.val > val:
            return self.searchBST(root.left, val)

        if root.val < val:
            return self.searchBST(root.right, val)

98.验证二叉搜索树

遇到 搜索树,一定想着中序遍历,这样才能利用上特性。 

但本题是有陷阱的,可以自己先做一做,然后在看题解,看看自己是不是掉陷阱里了。这样理解的更深刻。

题目链接/文章讲解:代码随想录

视频讲解:你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili

思路

       Carl哥真是厉害,完美的预判了我会踩坑里(每日崩溃1/1),我写完发现我就掉进了第一个陷阱了。。。

陷阱1

        不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。

陷阱2(和python无关吧)

        样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。

此时可以初始化比较元素为longlong的最小值。

        再告诉你一个冷知识:

要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

        我嘞个豆啊!还能这样。。。早知道这个冷知识说不定就写出来了。

代码
from typing import Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def __init__(self):
        self.res = []

    def traversal(self, root):
        if root is None:
            return

        self.traversal(root.left)
        self.res.append(root.val)
        self.traversal(root.right)

    def isValidBST(self, root):
        self.res = []
        self.traversal(root)

        for i in range(1, len(self.res)):
            if self.res[i] <= self.res[i - 1]:
                return False

        return True
  • 37
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值