首页 > 其他分享 >Day21 二叉树Part8

Day21 二叉树Part8

时间:2024-08-06 12:08:47浏览次数:6  
标签:node 遍历 self Day21 二叉 二叉树 Part8 root 节点

目录

任务

669. 修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

思路

最直接的想法是,对于不符合区间范围内的节点,直接返回空,然后通过归在上层接住下面的合法节点。可是这种思路是错误的,因为加入某节点的值<low,按照之前的思路是将这个节点及其子节点全部删除,但实际上,它的右子树上的值可能是满足条件的,删除了不该删除的节点(遇到不合法直接返回空的行为)。因此,如果遇到了不合法的节点,应该在其子树继续递归的寻找合法的节点作为新的节点代替不合法的节点返回给上层,而不是直接返回空。

class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if not root: return None
        if root.val < low: #删除root,从右子树上找到合适的节点作为新root
            right = self.trimBST(root.right,low,high)
            return right
        if root.val > high: #删除root,从左子树上找到合适的节点作为新root
            left = self.trimBST(root.left,low,high)
            return left
        
        #如果当前节点在区间内,则将符合条件的左右子树接入
        root.left = self.trimBST(root.left,low,high)
        root.right = self.trimBST(root.right,low,high)
        return root

108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡二叉搜索树。

思路

在做过了106.从中序与后序遍历序列构造二叉树 和105.从前序与中序遍历序列构造二叉树,这题就比较简单,思路是一样的。

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums: return None
        mid = len(nums)//2
        root = TreeNode(nums[mid])
        
        leftNums = nums[:mid]
        rightNums = nums[mid+1:]
        root.left = self.sortedArrayToBST(leftNums)
        root.right = self.sortedArrayToBST(rightNums)
        return root

538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

思路

只要看懂题意,结合BST的性质,这题不难,就是按照右根左的遍历顺序依次累加前一个节点的数值。第二次访问到节点时进行累加即可,别忘了修改pre指针,这里直接用数值更简便。

class Solution:
    def __init__(self):
        self.pre = 0
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        self.sumNode(root)
        return root
    
    def sumNode(self,node):
        if not node: return
        
        self.sumNode(node.right)
        node.val += self.pre      # 第二次访问自己时修改节点的值
        self.pre = node.val       # 并更新pre
        self.sumNode(node.left)

心得体会

至此,二叉树章节也已经步入尾声。
解决二叉树的题目关于递归的(dfs)主要思路如下:

  1. 树形DP问题,这类问题相对最简单,收集左子树信息(下层递归),收集右子树信息(下层递归),根据左右处理自己节点相关信息(局部),返回给上层。
  2. 路径相关问题,这类题目是在遍历过程中收集节点的信息,到达叶子节点后收集完一条路径,需要回溯处理(隐形局部或显性全局)
  3. 符合条件的节点问题, 这类题目是遍历到符合条件的节点后,向上返回,如果是删除插入等修改树结构的问题,有可能需要上层的指针域接住。
  4. 构造二叉树问题,这类问题是通过数组的类型(先中后序,有序数组等)来创建节点,然后将数组划分区间,递归地向左右继续创建
  5. 二叉搜索树相关问题,1.双指针法,利用中序遍历,记录pre,比较pre和node等记录信息等。 2.BST的增删查:符合条件的节点问题

总体思路为 递->向下 归->向上 该做什么

解决一些特定节点问题还可以用层序遍历,就是在层序遍历的过程中记录信息等。注意搭配层序遍历的本身写法(两层循环)

标签:node,遍历,self,Day21,二叉,二叉树,Part8,root,节点
From: https://www.cnblogs.com/haohaoscnblogs/p/18344854

相关文章

  • 手撕数据结构之二叉树
     1.树树的基本概念与结构树是⼀种⾮线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。•有⼀个特殊的结点,称为根结点,根结点没有前驱结点。•除根结点外,其余结点被分成M(M>0)......
  • 数据结构 顺序与链式二叉树的原理与实现(万字)
    目录一、树概念及结构树的概念树的相关概念树的表示二、二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构三、二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入堆的删除堆的代码实现Heap.hHeap.c堆的应......
  • Day20 二叉树Part7 二叉搜索树的增删查
    目录任务235.二叉搜索树的最近公共祖先思路701.二叉搜索树中的插入操作思路450.删除二叉搜索树中的节点思路心得体会任务235.二叉搜索树的最近公共祖先给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。思路由于是二叉搜索树,所以可以利用其性质进行查找,即,只有......
  • 算法力扣刷题总结篇 ——【五】二叉树章节
    前言从记录三十五【二叉树基础和递归遍历】到记录六十二【538.把二叉搜索树转换为累加树】28篇文章都是二叉树的章节。所以总结的任务量有点大啊。但还是要做的。完成之后,开启新章节……继续。一、题目回顾1-5:遍历方式模版题。6-14:确定遍历顺序。后序居多——先统......
  • 数据结构之《二叉树》(中)
    在数据结构之《二叉树》(上)中学习了树的相关概念,还了解的树中的二叉树的顺序结构和链式结构,在本篇中我们将重点学习二叉树中的堆的相关概念与性质,同时试着实现堆中的相关方法,一起加油吧!1.实现顺序结构二叉树在实现顺序结构的二叉树中通常把堆使用顺序结构的数组来存储,因......
  • day018二叉树
    530.二叉树的最小绝对差给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。 思路:此题与昨天的验证二叉搜索树很像,同样是中序遍历将二叉树节点按照顺序加入到动态数组中,随后遍历动态数组,维护一......
  • day014(二叉树章节)+北境互娱游戏开发一面
    222.完全二叉树节点的个数给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~ 2h 个......
  • 二叉树链式结构代码讲解与实现
    本片将续之前的文章二叉树的概念进行二叉树基本操作的实现,二叉树oj题将在下篇文章讲解。目录a.创建二叉树代码:一、二叉树的遍历1.1前序、中序以及后序遍历代码:如图:(前序遍历递归图解)测试代码:二、节点个数以及高度2.1 二叉树节点个数思想:要求二叉树的总节点个数,左......
  • 【数据结构】二叉树和堆
     一、二叉树1.二叉树的基本概念在C语言中,二叉树是一种基础的数据结构,它由节点组成,每个节点包含数据元素以及指向其他节点的指针。下面是二叉树的基本概念以及如何在C语言中表示和操作它。节点(Node):二叉树的每个元素称为节点,每个节点都有一个数据域和两个指针域,通常称为左指......
  • 代码随想录算法训练营Day18 | Leetcode 530 二叉搜索树的最小绝对差 Leetcode 236 二
    前言今天有一道题目没写,二叉搜索树中的众数,有点太难理解了,先放一放。Leetcode530二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:二叉搜索树的性质是中序遍历为升序的,所以我们想找最小绝......