首页 > 编程语言 >代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结

代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结

时间:2023-08-26 13:34:28浏览次数:44  
标签:right TreeNode 随想录 E6% 二叉 搜索 root 节点 left

 

669. 修剪二叉搜索树 

     卡哥建议:这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。

     题目链接/文章讲解:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

     视频讲解:https://www.bilibili.com/video/BV17P41177ud

      做题思路:

       递归处理,区间 [low, high],遇到 root->val < low || root->val > high 的时候直接return NULL,

     还有一种情况考虑不符合区间的节点,它的左子树或者右子树有符合区间的节点,比如,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除),如图:

 

 

     本题代码:

 1 class Solution {
 2 public:
 3     TreeNode* trimBST(TreeNode* root, int low, int high) {
 4         if (root == nullptr ) return nullptr;
 5         if (root->val < low) { //从根节点开始遍历,如果根节点小于区间左边界值,说明根节点是要修剪的节点,根据搜索树的特点,从根节点的右子树开始寻找符合区间的
 6             TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
 7             return right;
 8         }
 9         if (root->val > high) {
10             TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
11             return left;
12         }
13         root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
14         root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
15         return root;
16     }
17 };

 

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

     卡哥建议:本题就简单一些,可以尝试先自己做做。

 https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

    视频讲解:https://www.bilibili.com/video/BV1uR4y1X7qL

    做题思路:

     根据有序数组构造一棵二叉树。本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。分割点就是数组中间位置的节点。

    如果数组长度为偶数,中间节点有两个,取哪一个都可以,只不过构成了不同的平衡二叉搜索树。

    比如,如果要分割的数组长度为偶数的时候,中间元素为两个,是取左边元素 就是树1,取右边元素就是树2。

    本题代码:

 1 class Solution {
 2 private:
 3     TreeNode* traversal(vector<int>& nums, int left, int right) {
 4         if (left > right) return nullptr; //非法区间
 5         int mid = left + ((right - left) / 2); //切割点
 6         TreeNode* root = new TreeNode(nums[mid]);
 7         root->left = traversal(nums, left, mid - 1); //区间为左闭右闭,所以 mid-1 为对应下标的值,这里看卡哥视频理解
 8         root->right = traversal(nums, mid + 1, right);
 9         return root;
10     }
11 public:
12     TreeNode* sortedArrayToBST(vector<int>& nums) {
13         TreeNode* root = traversal(nums, 0, nums.size() - 1);
14         return root;
15     }
16 };

 

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

      卡哥建议:本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。

https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html

     视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP

      做题思路:

      二叉搜索树的有序数组,是按中序遍历得到的,就是左中右,那累加的话,理解题意后,就是从后到前加起来,顺序是右中左。

    所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。

    本题依然需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。

     本题代码:

 1 class Solution {
 2 private:
 3     int pre = 0; // 记录前一个节点的数值
 4     void traversal(TreeNode* cur) { // 右中左遍历
 5         if (cur == NULL) return;
 6         traversal(cur->right); //右
 7         cur->val += pre;//中
 8         pre = cur->val;
 9         traversal(cur->left);//左
10     }
11 public:
12     TreeNode* convertBST(TreeNode* root) {
13         pre = 0;
14         traversal(root);
15         return root;
16     }
17 };

 

  总结:

 https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html

 

 

标签:right,TreeNode,随想录,E6%,二叉,搜索,root,节点,left
From: https://www.cnblogs.com/romantichuaner/p/17646804.html

相关文章

  • 代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树
      235. 二叉搜索树的最近公共祖先    卡哥建议:相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。   题目链接/文章讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%B......
  • [刷题记录Day14]Leetcode二叉树
    No.1题目前序遍历思路递归法代码publicvoidTraverse(TreeNodenode,List<Integer>list){if(node==null)return;list.add(node.val);//中Traverse(node.left,list);//左Traverse(node.right,list);//右}p......
  • [刷题记录Day15]Leetcode二叉树
    No.1题目二叉树的层序遍历思路使用队列关键点:1.每进入一层,层内的节点都被处理完成2.开始遍历层内的节点前,必须先记录该层的节点数量,不能访问到下一层的节点代码publicList<List<Integer>>levelOrder(TreeNoderoot){Queue<TreeNode>queue=newLinkedList......
  • [刷题记录Day17]Leetcode二叉树
    No.1题目平衡二叉树思路递归法在遍历中比较左右子树的高度差递归分析参数:当前传入节点。返回值:以当前传入节点为根节点的树的高度那么如何标记左右子树是否差值大于1呢?可以返回-1来标记已经不符合平衡树的规则了明确终止条件:递归的过程中依然是遇到空节点了为终止,返......
  • [刷题记录Day16]Leetcode二叉树
    No.1题目二叉树的最大深度思路递归其实是后序遍历的方式代码publicintmaxDepth(TreeNoderoot){if(root==null)return0;returnMath.max(1+maxDepth(root.left),1+maxDepth(root.right));}No.2题目二叉树的最小深度思路......
  • [刷题记录Day18]Leetcode二叉树
    No.1题目找树左下角的值思路队列,层序遍历Deque既可以用作栈也可以用作队列,谨慎使用代码publicintfindBottomLeftValue(TreeNoderoot){Queue<TreeNode>queue=newLinkedList<>();queue.add(root);intresult=0;//记录最后一行第一个元素......
  • 代码随想录第三天|203.移除列表元素;707.设计链表;206.反转链表
    今天最大的收获不是学会了几道题,而是突然改变了自己之前的想法,总想刷一遍就能把题弄回,这样在遇到难题时会拖延很长的时间,备受挫折,做一两道题就再也不想做了,刷题也就终止了应该做好刷三遍题的准备,第一遍,大量看题,看解题思路,在看题的过程中积累知识和解题技巧,不要迷恋在某一道题上,看......
  • 《算法笔记》树与二叉树专题练习
    1、复原二叉树(由前序和中序求后序)题目描述小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。输入输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写......
  • 二叉搜索树的公共祖先
    力扣(LeetCode)官网-全球极客挚爱的技术成长平台1TreeNode*lowestCommonAncestor(TreeNode*root,TreeNode*p,TreeNode*q){2if(root==nullptr||root==p||root==q)returnroot;3//如果该结点比两个结点都大或则都小,则只需要搜索右子树或左子树,而......
  • 力扣---1448. 统计二叉树中好节点的数目
    给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。「好节点」X定义为:从根到该节点X所经过的节点中,没有任何节点的值大于X的值。 示例1:输入:root=[3,1,4,3,null,1,5]输出:4解释:图中蓝色节点为好节点。根节点(3)永远是个好节点。节点4->(3,4)是路......