算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654. 最大二叉树

题目

思路与解法

python 复制代码
# Definition for a binary tree node.
# 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)
        root.left = self.constructMaximumBinaryTree(nums[:max_idx])
        root.right = self.constructMaximumBinaryTree(nums[max_idx+1:])
        return root

617.合并二叉树

题目

思路与解法

第一想法: 通过层序遍历来合并

一遍过,哈哈,虽然肯定有可以优化的地方

python 复制代码
# Definition for a binary tree node.
# 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 not root1:
            return root2
        if not root2:
            return root1

        from collections import deque
        queue1 = deque()
        queue2 = deque()
        queue1.append(root1)
        queue2.append(root2)
        while queue1 or queue2:
            cur1 = queue1.popleft()
            cur2 = queue2.popleft()
            cur_new_val = cur1.val + cur2.val
            cur1.val = cur_new_val
            if not cur1.left and cur2.left:
                cur1.left = TreeNode(0)
            elif cur1.left and not cur2.left:
                cur2.left = TreeNode(0)
            if not cur1.right and cur2.right:
                cur1.right = TreeNode(0)
            elif cur1.right and not cur2.right:
                cur2.right = TreeNode(0)
            if cur1.left:
                queue1.append(cur1.left)
                queue2.append(cur2.left)
            if cur1.right:
                queue1.append(cur1.right)
                queue2.append(cur2.right)
            
        return root1

700.二叉搜索树中的搜索

题目

思路与解法

第一想法:

python 复制代码
# Definition for a binary tree node.
# 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]:
        val_node = self.find_root(root, val)
        return val_node


    def find_root(self, node, val):
        if not node:
            return None
        if node.val == val:
            return node
        elif node.val > val:
            return self.find_root(node.left, val)
        elif node.val < val:
            return self.find_root(node.right, val)

98.验证二叉搜索树

题目

思路与解法

第一想法: 判断每个结点作为root结点构成的子树是不是二叉搜索树,如下。但是有坑,光判断每个子数是不够的,因为子树中结点可能不满足子树外的条件

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
            
        if root.left and root.left.val >= root.val:
            return False

        if root.right and root.right.val <= root.val:
            return False
        return self.isValidBST(root.left) and self.isValidBST(root.right)

如下就不满足条件,

思考后的想法: 中序遍历后,挨个判断是不是递增的。发现carl也是这么做的,只是他有几种方法。

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        self.nodes = []
        self.traversal(root)
        for i in range(len(self.nodes)-1):
            if self.nodes[i] >= self.nodes[i+1]:
                return False
        return True


    def traversal(self, root):
        if not root:
            return None
        self.traversal(root.left)
        self.nodes.append(root.val)
        self.traversal(root.right)
相关推荐
kkeeper~4 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6665 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964136 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚6 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov8 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫8 小时前
特征工程处理
人工智能·算法·机器学习
z落落8 小时前
C#参数区别
java·算法·c#
c238569 小时前
vector(下)
数据结构·算法
z落落9 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法