首页 > 其他分享 >Day17 二叉树Part5

Day17 二叉树Part5

时间:2024-08-02 12:28:36浏览次数:17  
标签:right return val self Day17 二叉树 root 节点 Part5

目录

任务

654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。

思路

做了昨天的利用前中序(或者中后)数组构建二叉树,就会做这道题,思路基本一致。按照算法,分割数组区域并创建即可。

class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums)==0: return None
        index = 0 
        maxValue = float('-inf')
        
        for i in range(len(nums)):
            if nums[i] > maxValue:
                maxValue = nums[i]
                index = i
        
        root = TreeNode(nums[index])
        leftNums = nums[:index]
        rightNums = nums[index+1:]
        root.left = self.constructMaximumBinaryTree(leftNums)
        root.right = self.constructMaximumBinaryTree(rightNums)
        return root

617. 合并二叉树

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。

思路

单层递归逻辑: 分情况合并当前节点

  1. 两树都不存在节点
  2. 两树只有一个存在,则返回有的那个
  3. 都存在,则将节点和相加并构建成新节点,并且分别递归的合并其左右子树

这道题也是结合了遍历过程和传统递归的思路

class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2: return None
        if root1 and not root2: return root1
        if not root1 and root2: return root2
        if root1 and root2: 
            newRoot = TreeNode(root1.val + root2.val)
            newRoot.left = self.mergeTrees(root1.left,root2.left)
            newRoot.right = self.mergeTrees(root1.right,root2.right)
            return newRoot

700.二叉搜索树中的搜索

思路

这道题很简单,递归的思路就是遍历节点,找到就返回,否则根据条件向相应的子树去找。
迭代的思路是,val较小就往当前节点左子树找,val较大就往当前节点的右子树找,直到找到或者到达None.

# 递归法
class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root: return None
        if root.val == val: return root
        if val < root.val: return self.searchBST(root.left,val)
        else: return self.searchBST(root.right,val)

# 迭代法
class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        while root:
            if val < root.val: root = root.left
            elif val > root.val: root = root.right
            else: return root
        return None   

98. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左
子树
只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

思路(错误)

想当然的解法是直接用递归,判断当前节点的局部逻辑是否满足(它比它右节点小,比它左节点大),然后再判断左右子树是否满足,全部满足则返回True。可惜这种思路是错误的。。反例 [5,4,6,null,null,3,7], 某节点必须比他的左子树所有的值小,右子树所有的值大。这个7大于了根节点的大小,违反了BST的定义

class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root: return True
        elif not root.left and not root.right: return True
        elif root.left and not root.right:
            if root.val > root.left.val: return True
            else:return False
        elif not root.left and root.right:
            if root.val < root.right.val: return True
            else:return False    
        else: 
            if root.val > root.left.val and  root.val < root.right.val:
                return self.isValidBST(root.left ) and self.isValidBST(root.right)
            else:
                return False

思路(正确)

判断中序序列是否有序

class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        lst = []
        self.inorder(root,lst)
        print(lst)
        for i in range(len(lst)-1):
            if lst[i] >= lst[i+1]: return False
        return True

    def inorder(self,root,lst):
        if not root: return None
        
        self.inorder(root.left,lst)
        lst.append(root.val)
        self.inorder(root.right,lst)

心得体会

更娴熟的掌握了单纯递归逻辑(局部+递归),以及递归序遍历流程的思路。

标签:right,return,val,self,Day17,二叉树,root,节点,Part5
From: https://www.cnblogs.com/haohaoscnblogs/p/18338498

相关文章

  • 代码随想录day17 || 654 最大二叉树,617 合并二叉树,700 二叉搜索树搜索,98 验证二叉搜索
    645最大二叉树funcconstructMaximumBinaryTree(nums[]int)*TreeNode{ //思路,算法思路基本等同于通过中序前序构造二叉树 //1,取最大值作为根节点 //2,切割数组 //3,递归左右子树 iflen(nums)==0{ returnnil } //切割数组取最大值 max,left,right:=......
  • 数据结构:二叉树(链式结构)
    文章目录1.二叉树的链式结构2.二叉树的创建和实现相关功能2.1创建二叉树2.2二叉树的前,中,后序遍历2.2.1前序遍历2.2.2中序遍历2.2.3后序遍历2.3二叉树节点个数2.4二叉树叶子结点个数2.5二叉树第k层结点个数2.6二叉树的深度/高度2.7二叉树查找值为x的结点2.8......
  • 图解平衡二叉树
    平衡二叉树平衡二叉树的背景由于一些众所周知的原因,我们选择了平衡二叉树,好吧,其实就是因为对二叉搜索树的限制太少了,导致在一些特殊的情况下,二叉搜索树不太听话,查找,插入与删除的时间均变成了\(O(n)\)也可以认为,熵增就会更加有序,熵减就会更加自由,这里我们......
  • DAY 15 二叉树part03
      110.平衡二叉树(优先掌握递归)题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 独立完成,感觉还比较好理解12classSolution{13public:14boolisBalanced(TreeNode*root){15if(......
  • 数据结构----树,二叉树,哈夫曼树相关概念及其实现
    树形结构概述1分层逻辑结构所谓的分层逻辑结构,也称为树形逻辑结构关系,是数据结构中的一种逻辑关系结构,在该逻辑结构关系中的数据元素之间满足一对多的逻辑结构关系:起始数据节点有且仅有一个,没有直接前驱,可以有多个直接后继;末尾数据节点可以多个,有且仅有一个直接前驱,......
  • 【大厂笔试】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
    检查两棵树是否相同100.相同的树-力扣(LeetCode)思路解透两个根节点一个为空一个不为空的话,这两棵树就一定不一样了若两个跟节点都为空,则这两棵树一样当两个节点都不为空时:若两个根节点的值不相同,则这两棵树不一样若两个跟节点的值相同,则对左右两棵子树进行递归......
  • 代码随想录day16 || 513 树左下角值,112 路径之和,116 中序后序遍历构造二叉树
    切片传递问题question:什么情况下传递切片,什么情况下传递切片指针,为什么有时候会修改原始副本,有时候又不会呢?typesli[]intfuncmain(){ slice:=[]int{1} fmt.Printf("slice:%p\n",slice) change1(slice) fmt.Println("=================================") s2:=......
  • Day16 二叉树Part4 常规递归和遍历法的综合应用(二叉树相关)
    目录任务112.路径总和思路113.路径总和II思路106.从中序与后序遍历序列构造二叉树思路105.从前序与中序遍历序列构造二叉树思路心得体会任务112.路径总和给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路......
  • 实训日记day17
    nginx实现负载均衡机器前期准备:下载httpd:[root@fuwuq~]yum-yinstallhttpd下载nginx:[[email protected]]#wgethttps://nginx.org/download/nginx-1.26.1.tar.gz​解压:[[email protected]]#tar-zxvfnginx-1.26.1.tar.gz......
  • Day15 二叉树Part2 初见回溯(二叉树相关)
    任务110.平衡二叉树给定一个二叉树,判断它是否是平衡二叉树思路典型的树形DP,每个节点向它的左右孩子收集信息,然后利用收集到的信息判断当前节点,最后再将信息传给上层。对于本题,每个节点要判断以自己为根的树是否是平衡二叉树,需要判断3个条件:自己的左子树是否平衡自己的右子......