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]
示例 3:
输入:root = [1], low = 1, high = 2
输出:[1]
示例 4:
输入:root = [1,null,2], low = 1, high = 3
输出:[1,null,2]
示例 5:
输入:root = [1,null,2], low = 2, high = 4
输出:[2]
提示:
树中节点数在范围 [1, 104] 内
0 <= Node.val <= 104
树中每个节点的值都是唯一的
题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:非递归解法
class Solution { public: TreeNode* trimBST(TreeNode* root, int low, int high) { while(root!=nullptr && (root->val < low ||root->val > high)) { while(root!=nullptr && root->val < low) { root = root->right; } while(root!=nullptr && root->val > high) { root=root->left; } if(root == nullptr) { return nullptr; } } TreeNode* leftHead = root; TreeNode* preNode = nullptr; //trim low while(leftHead!=nullptr) { while(leftHead!=nullptr && leftHead->val >= low) { preNode = leftHead; leftHead = leftHead->left; } if(leftHead==nullptr) { break; } leftHead = leftHead->right; while(leftHead != nullptr&& leftHead->val < low) { leftHead = leftHead->right; } if(nullptr != preNode) { preNode->left = leftHead; } } //trim high TreeNode* rightHead = root; while(rightHead!=nullptr) { while(rightHead!=nullptr && rightHead->val <= high) { preNode = rightHead; rightHead = rightHead->right; } if(rightHead == nullptr) { break; } rightHead = rightHead->left; while(rightHead!=nullptr && rightHead->val >high) { rightHead = rightHead->left; } if(preNode != nullptr) { preNode->right = rightHead; } } return root; } };
方法2:
class Solution { public: TreeNode* trimBST(TreeNode* root, int low, int high) { if(!root) { return root; } 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; } };