首页 > 其他分享 >leetcode刷题day20|二叉树Part08(669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)

leetcode刷题day20|二叉树Part08(669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)

时间:2024-09-16 21:20:23浏览次数:3  
标签:转换 递归 TreeNode 二叉 int 搜索 return root 节点

669. 修剪二叉搜索树

思路:理解了删除二叉搜索树中的节点,这个题理解起来就不难了。
还是选用中序遍历递归。

递归三步曲:
1、传入参数:根节点,最小值,最大值;返回值为根节点;
2、终止条件:如果节点为空,直接返回空;
3、递归逻辑:如果最小值小于该节点,递归调用该节点的右孩子(检查右孩子中是否有不符合条件的进行移除)并返回;如果最大值大于该节点,递归调用该节点的左孩子(检查左孩子中是否有不符合条件的进行移除)并返回;用当前节点的左孩子接收递归调用该节点的左孩子;用当前节点的右孩子接收递归调用该节点的右孩子。

移除的逻辑不太好理解,需要多思考
代码如下:

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root==null) return null;
        if(root.val<low) return trimBST(root.right,low,high);
        if(root.val>high) return trimBST(root.left,low,high);
        root.left=trimBST(root.left,low,high);
        root.right=trimBST(root.right,low,high);
        return root;
    }
}

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

思路:本题的本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。区间仍然是左闭右开区间。

递归三步曲:
1、传入参数:数组,start,end,根节点;返回值为根节点。
2、终止条件:如果start大于等于end说明区间中无节点了,返回null;
3、递归函数逻辑:找到中间节点(start+end)/2+1;建立root;递归调用得到root.left;递归调用得到root.right;返回root。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return arrayToBST(nums,0,nums.length);
    }
    public TreeNode arrayToBST(int[] nums,int start,int end){
        if(start>=end) return null;
        int index=(start+end)/2;
        TreeNode root=new TreeNode(nums[index]);
        root.left=arrayToBST(nums,start,index);
        root.right=arrayToBST(nums,index+1,end);
        return root;
    }
}

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

思路:从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加。定义两个全局变量,一个记录总和的变量,一个指向前一个节点的指针。

递归三步曲:
1、传入参数:传入根节点,返回根节点。
2、终止条件:如果节点为空,返回空。
3、递归函数逻辑:递归调用右孩子;sum加上pre赋值给当前节点,将当前节点的值赋值给pre;递归调用左孩子。

递归代码如下:

class Solution {
    int sum=0;
    public TreeNode convertBST(TreeNode root) {
        if(root==null) return null;
        convertBST(root.right);
        sum+=root.val;
        root.val=sum;
        convertBST(root.left);
        return root;
    }
}

标签:转换,递归,TreeNode,二叉,int,搜索,return,root,节点
From: https://blog.csdn.net/m0_51007517/article/details/142304605

相关文章

  • leetcode刷题day19|二叉树Part07(235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的
    235.二叉搜索树的最近公共祖先思路:二叉搜索树首先考虑中序遍历。根据二叉搜索树的特性,如果p,q分别在中间节点的左右两边,该中间节点一定是最近公共祖先,如果在同一侧,则递归这一侧即可。递归三部曲:1、传入参数:根节点,p,q,返回节点。2、终止条件:因为p,q一定存在,所以不会遍历到......
  • 搜索 DFS深度优先搜索
    洛谷P1363幻象迷宫这种恶魔样例究竟是哪个天才想出来的?!!!!!!620#.##.##.##.##.##.##.#.##.##.##.##.##.##.#.##.##.##.##.##.##.S.#..#..#..#..#..#..##..#..#..#..#..#..##..#..#..#..#..#..##md,交了好几发都没过,看了一下这个样例,心都凉了。能想出来这题解的更是天才Orz......
  • 代码随想录算法 - 二叉树6
    题目1235.二叉搜索树的最近公共祖先给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如......
  • Day16 二叉树part06| LeetCode 530.二叉搜索树的最小绝对差 ,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差530.二叉搜索树的最小绝对差classSolution{publicList<Integer>res=newArrayList<>();voidtraversal(TreeNoderoot){if(root==null)return;traversal(root.left);......
  • Jina AI 发布 Reader-LM-0.5B 和 Reader-LM-1.5B:为网络数据处理提供多语种、长语境和
    JinaAI发布的Reader-LM-0.5B和Reader-LM-1.5B标志着小语言模型(SLM)技术的一个重要里程碑。这些模型旨在解决一个独特而具体的挑战:将开放网络中原始、嘈杂的HTML转换为干净的标记符格式。这项任务看似简单,却面临着复杂的挑战,尤其是在处理现代网络内容中的大量噪音......
  • 深入了解Python中的浮点数、自动转换、强制转换与增强赋值运算符
    本套课程在线学习视频https://pan.quark.cn/s/3a470a7bbe67Python是一种强类型语言,具有动态类型和自动内存管理的特性。在数学和科学计算中,浮点数(float)是非常重要的数据类型。本文将详细探讨浮点数的概念、自动转换、强制转换以及增强赋值运算符。通过详细的代码示例和运行结果,帮......
  • 搜索
    1、BFS广度优先搜索一般用于地图的搜索遍历,最短路中的SPFA也是洛谷P1126机器人搬重物<1>对于面对方向的计算设四个方向分别为0,1,2,3转向的时候只需要(原方向代号+4±1)%4就可以得到转向后面对的新方向<2>对于每种状态,构建hash,在每次走后判断该种情况是否已经出现......
  • Day15 二叉树part05| LeetCode 654.最大二叉树,617.合并二叉树 ,700.二叉搜索树中的搜索
    654.最大二叉树654.最大二叉树classSolution{publicTreeNodeconstructMaximumBinaryTree(int[]nums){if(nums.length==1)//遍历到了叶子节点{returnnewTreeNode(nums[0]);}intmaxValue=nums[0......
  • Java-数据结构-二叉树-习题(二) (´▽`)ノ
    文本目录:❄️一、习题一(分层遍历):   ▶ 思路:    ▶代码:❄️二、习题二(二叉树的最近公共祖先):    ▶ 思路: ▶代码: ❄️三、习题三(从前序和中序遍历序列中构造二叉树):     ▶ 思路:  ▶代码:❄️四、习题四(从中序和后序遍历序列中构造二......
  • 使用 O(1) 额外内存删除二叉树
    这是一个naive的做法:voiddeleteTreeRec(TreeNode*root){if(root==NULL)return;deleteTreeRec(root->left);deleteTreeRec(root->right);cout<<"Deletingnode"<<root->data<<endl;deleteroot;}O(1)空......