精品网站建设价格,易云巢做网站公司,河南省建设厅村镇建设处网站,贵州遵义知名网站建设二叉查找树#xff08;BST#xff09;#xff1a;根节点大于等于左子树所有节点#xff0c;小于等于右子树所有节点。 二叉查找树中序遍历有序。 669. 修剪二叉搜索树
给你二叉搜索树的根节点 root #xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树BST根节点大于等于左子树所有节点小于等于右子树所有节点。 二叉查找树中序遍历有序。 669. 修剪二叉搜索树
给你二叉搜索树的根节点 root 同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即如果没有被移除原有的父代子代关系都应当保留)。 可以证明存在 唯一的答案 。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意根节点可能会根据给定的边界发生改变。
示例 1 输入root [1,0,2], low 1, high 2 输出[1,null,2] 示例 2 输入root [3,0,4,null,2,null,null,1], low 1, high 3 输出[3,2,null,1] 提示
树中节点数在范围 [ 1 , 1 0 4 ] [1, 10^4] [1,104] 内 0 N o d e . v a l 1 0 4 0 Node.val 10^4 0Node.val104树中每个节点的值都是 唯一 的题目数据保证输入是一棵有效的二叉搜索树 0 l o w h i g h 1 0 4 0 low high 10^4 0lowhigh104
思路
法一递归
任意一个节点的val对给定的范围只有三种可能等于、小于、大于
等于也就在给定的范围内则保留再分别判断该节点的左子树和右子树小于当该节点小于给定范围的最小值时要将该节点以及该节点的左子树都修剪掉让该节点的父节点的左指针指向该节点的右子树再进行判断大于当该节点大于给定范围的最大值时要将该节点以及该节点的右子树都修剪掉让该节点的父节点的右指针指向该节点的左子树再进行判断
法二迭代
该题自然能够使用「迭代」进行求解起始先从给定的 root 进行出发找到第一个满足值符合 [low,high]范围的节点该节点为最后要返回的真正的根节点 root。
然后分别处理root节点的左子树和右子树
这里对左子树只需修剪掉小于所给范围的节点 若节点大于给定范围的最小值时这该节点的右子树一定在范围内不修剪继续判断其左子树若节点小于给定范围的最小值时要将该节点以及该节点的左子树都修剪掉让该节点的父节点的左指针指向该节点的右子树再进行判断。 而对右子树只需修剪掉大于所给范围的节点; 若节点小于给定范围的最大值时这该节点的左子树一定在范围内不修剪继续判断其左子树若节点大于给定范围的最大值时要将该节点以及该节点的右子树都修剪掉让该节点的父节点的右指针指向该节点的左子树再进行判断。
代码(Java、C)
法一递归 Java
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val val;* this.left left;* this.right right;* }* }*/
class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if(root null) return null;if(root.val low root.val high){root.left trimBST(root.left, low, high);root.right trimBST(root.right, low, high);}else if(root.val low){return trimBST(root.right, low, high);}else if(root.val high){return trimBST(root.left, low, high);}return root;}
}C
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root nullptr) return nullptr;if(root-val low root-val high){root-left trimBST(root-left, low, high);root-right trimBST(root-right, low, high);}else if(root-val low){return trimBST(root-right, low, high);}else if(root-val high){return trimBST(root-left, low, high);}return root;}
};法二迭代 Java
class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {while(root ! null (root.val low || root.val high)){root root.val low ? root.right : root.left;}if(root null) return null;TreeNode tem root;while(tem.left ! null){if(tem.left.val low){tem tem.left;}else{tem.left tem.left.right;}}tem root;while(tem.right ! null){if(tem.right.val high){tem tem.right;}else{tem.right tem.right.left;}}return root;}
}C
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {while(root ! nullptr (root-val low || root-val high)){root root-val low ? root-right : root-left;}if(root nullptr) return nullptr;TreeNode* tem root;while(tem-left ! nullptr){if(tem-left-val low){tem tem-left;}else{tem-left tem-left-right;}}tem root;while(tem-right ! nullptr){if(tem-right-val high){tem tem-right;}else{tem-right tem-right-left;}}return root;}
};运行结果 复杂度分析
时间复杂度 O ( n ) O(n) O(n)其中 n 为二叉树的结点数目。空间复杂度 O ( 1 ) O(1) O(1)。迭代只需要常数级空间而递归的话递归栈最坏情况下需要 O ( n ) O(n) O(n) 的空间。
题目来源力扣。 放弃一件事很容易每天能坚持一件事一定很酷一起每日一题吧 关注我 leetCode专栏每日更新 注 如有不足欢迎指正