首页 > 其他分享 >Day18 二叉树Part6

Day18 二叉树Part6

时间:2024-08-03 13:39:14浏览次数:10  
标签:node pre return self count 二叉树 Part6 Day18 节点

目录

任务

530. 二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。

思路

最简单的做法是讲二叉搜索树转为有序数组(中序序列),然后遍历数组求最小绝对差。
这里我使用递归的思路来进一步熟悉递归。由二叉搜索树的特性,采用中序遍历,过程中使用pre指针,判断pre指针指向的元素和遍历到的当前元素的差值,最终保存最小的差值。#### 注意

使用了成员变量本题变得比较简单和直观,第一次做的时候,用的是传参,由于python中的传参是传值,疯狂出错= =,非常绕,而且当是可变类型变量时,与之前的List作为参数产生对比,之前是直接对List的内容进行操作(路径之和II等,append),所以每层递归操作的都是同一个List,而本题如果采用传参,语句中的pre相当于局部变量,每一层的pre都之和自己有关,因此需要作为left,right返回值,才能达到修改。此外还有个minDelta,也要用返回值操作

class Solution:
    def __init__(self):
        self.minDelta = float('inf')
        self.pre = None
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.dfs(root)
        return self.minDelta
    
    def dfs(self,node):
        if not node: return
        
        self.dfs(node.left)
        if self.pre:
            self.minDelta = min(self.minDelta,node.val - self.pre.val)
            
        self.pre = node
        self.dfs(node.right)

501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。

思路

第一反应同样是直接转中序数组,然后用map统计频率,再排序。
如果采用递归的方法做,该如何做呢?这个只遍历一遍挺难想,比较巧妙,特别是用maxSize比较难想到
思路是,中序遍历的过程中,遍历到节点该如何统计呢?
因为涉及到前后比较,还是使用pre指针,由于中序遍历值有序,所以在中序中的处理步骤如下

  1. pre为空时,就是node到达中序的第一个节点,count = 1。
  2. pre.val与node.val相等时,count += 1
  3. 不等时,count = 1
  4. 如果count == maxSize ,则将该节点的值加入到结果中
  5. 如果count > maxSize,则先清空结果数组,再将新节点的值加入到结果中
  6. 别忘了pre = node 来移动pre哦, node是由于递归结构自动移动的(中序)
class Solution:
    def __init__(self):
        self.maxSize = 0
        self.pre = None
        self.count = 0
        self.res = []
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.inorder(root)
        return self.res
    def inorder(self,node):
        if not node:return

        self.inorder(node.left)
        if not self.pre:
            self.count= 1
        elif self.pre.val == node.val:
            self.count+=1
        else: self.count = 1

        if self.count == self.maxSize:
            self.res.append(node.val)

        if self.count > self.maxSize:
            self.maxSize = self.count
            self.res.clear()
            self.res.append(node.val)
        self.pre = node
        self.inorder(node.right)

236. 二叉树的最近公共祖先

思路

由于要知道自己的后面(左子树和右子树)有没有p或者q,即收集后续的信息,返回给上层,采用后序遍历的方法。同样好写不好想的一题。

  • 空节点直接返回空
  • 如果节点是p或者q,返回自己给上层 (这里隐藏了一个自己是父节点的情况)
  • 否则如果节点一边返回的是空,而另一边非空,则返回另一边的值给上层
  • 否则如果节点为叶子,则返回None
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        return self.dfs(root,p,q)
    def dfs(self,node,p,q):
        if not node: return None
        if node == p or node == q: return node
        
        left = self.dfs(node.left,p,q)
        right = self.dfs(node.right,p,q)
        
        if left and right: return node
        elif not left and right: return right
        elif left and not right: return left
        else: return None

心得体会

今天知道了py中,成员变量在递归中比较好用,因为保存了状态,对于函数相当于全局变量,此后的递归中都会影响同样的变量。而由于py中的传参为传值,即使是可变类型,传的也是‘引用’的值,对于它本身来讲,每次调用函数都是参数都相当于是新的局部变量,但是可以修改可变参数的内容。今天的题目修改的是引用本身,所以就不能按照之前修改List内容的思路处理了。
而Cpp中传引用就比较好处理,其引用参数的地位和成员变量是一样的。

标签:node,pre,return,self,count,二叉树,Part6,Day18,节点
From: https://www.cnblogs.com/haohaoscnblogs/p/18340369

相关文章

  • 先(后)序遍历确定唯一二叉树
    在二叉树的先序遍历或后序遍历序列中,如果我们记录了空节点的位置(通常用特殊符号如'#'表示),就足以唯一确定一棵二叉树的结构。这种方法的关键在于,记录空节点的位置能够帮助我们在遍历序列中准确地还原出树中节点的结构信息。因此,只要给出了先序遍历或后序遍历序列以及空节点的位置,......
  • 数据结构--------二叉树的定义及遍历操作的实现
    /*二叉树的链式存储以及基本操作*/#include<stdio.h>#include<stdlib.h>//树的节点typedefstructBTNode{intdata;structBTNode*lchild;structBTNode*rchild;}BTNode,*BTTree;/......
  • 【代码随想录训练营第42期 Day17打卡 二叉树Part5-LeetCode 654.最大二叉树 617.合并
    目录一、做题心得二、题目与题解题目一:654.最大二叉树题目链接题解:递归题目二:617.合并二叉树题目链接题解:递归(前序遍历)题目三:617.合并二叉树题目链接题解:BFS层序遍历 题目四:98.验证二叉搜索树题目链接题解:递归(中序遍历)三、小结一、做题心得今天是代码随想......
  • Day17 二叉树Part5
    目录任务654.最大二叉树思路617.合并二叉树思路700.二叉搜索树中的搜索思路98.验证二叉搜索树思路(错误)思路(正确)心得体会任务654.最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归......
  • 代码随想录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)思路解透两个根节点一个为空一个不为空的话,这两棵树就一定不一样了若两个跟节点都为空,则这两棵树一样当两个节点都不为空时:若两个根节点的值不相同,则这两棵树不一样若两个跟节点的值相同,则对左右两棵子树进行递归......