当前位置:网站首页>669. Prune binary search tree ●●
669. Prune binary search tree ●●
2022-07-05 04:50:00 【chenyfan_】
669. Prune the binary search tree ●●
Give you the root node of the binary search tree root , At the same time, the minimum boundary is given low And the maximum boundary high. By pruning the binary search tree , Make the values of all nodes in
[low, high]in . Pruning trees Should not be Change the relative structure of the elements retained in the tree ( namely , If not removed , The original relationship between father and son should be preserved ). Can prove that , There is The only answer .
Input :root = [3,0,4,null,2,null,null,1], low = 1, high = 3
Output :[3,2,null,1]
For binary search trees ,
If root->val < low, Then the pruned binary tree must appear on the right of the root node ;
If root->val > high, Then the pruned binary tree must appear on the left of the root node .
recursive
Time complexity :O(N), among N Are all the nodes of a given tree . We can visit each node at most once .
Spatial complexity :O(N), Even if we don't explicitly use any additional memory , In the worst case , The stack of our recursive calls may be as large as the number of nodes .
- Traverse from top to bottom , After pruning a node , You need to judge this node again ( Return to the pruned subtree );
class Solution {
public:
TreeNode* pre = nullptr;
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
if(root->val < low){
return trimBST(root->right, low, high); // Return to the pruned right subtree
}else if(root->val > high){
return trimBST(root->left, low, high); // Return to the pruned left subtree
}
root->left = trimBST(root->left, low, high); // Prune the left subtree
root->right = trimBST(root->right, low, high); // Prune right subtree
return root;
}
};
- From the bottom up , Pruning the subtree does not affect the structure of the nodes above , At the same time, you can traverse the whole tree without re judging a node .
class Solution {
public:
TreeNode* pre = nullptr;
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
if(root->val < low){
// root->left = nullptr; // Delete left subtree
return root->right; // And replace the node with a right subtree
}else if(root->val > high){
// root->right = nullptr; // Delete the right subtree
return root->left; // And replace the node with the left subtree
}
return root;
}
};
iteration
Due to the orderliness of the search tree , Therefore, there is no need to use the stack to simulate the recursive process , The process is :
- First put the root node root Move to the range , Determine the new root node ;
- Handle unqualified nodes in the left subtree of the current root node ;
- Handle unqualified nodes in the right subtree of the current root node .
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
// Determine the root node in the interval
while(root != nullptr){
if(root->val < low){
root = root->right;
}else if(root->val > high){
root = root->left;
}else{
break;
}
}
// here root Already in [low, high] Within the scope of , Handle left child element less than low The situation of
TreeNode* curr = root;
while(curr != nullptr){
// 【 Notice that this is while loop , Until we find the qualified > low Replace the left child node of 】
while(curr->left != nullptr && curr->left->val < low){
curr->left = curr->left->right;
}
curr = curr->left;
}
// here root Already in [low, high] Within the scope of , Deal with the right child high The situation of
curr = root;
while(curr != nullptr){
// 【 Notice that this is while loop 】
while(curr->right != nullptr && curr->right->val > high){
curr->right = curr->right->left;
}
curr = curr->right;
}
return root;
}
};
边栏推荐
- Practice | mobile end practice
- Setting up redis cluster cluster under Windows
- 【acwing】836. Merge sets
- 2022 American College Students' mathematical modeling ABCDEF problem thinking /2022 American match ABCDEF problem analysis
- 【acwing】528. cheese
- 【acwing】837. Number of connected block points
- [groovy] closure (closure call | closure default parameter it | code example)
- [groovy] closure closure (customize closure parameters | customize a single closure parameter | customize multiple closure parameters | specify the default value of closure parameters)
- windows下Redis-cluster集群搭建
- 2022 thinking of mathematical modeling a problem of American college students / analysis of 2022 American competition a problem
猜你喜欢

xss注入

Séparation et combinaison de la construction du système qualité

Invalid bound statement (not found) in idea -- problem solving

AutoCAD - graphic input and output

An article takes you to thoroughly understand descriptors
![[groovy] closure (closure parameter binding | curry function | rcurry function | ncurry function | code example)](/img/90/0cf08ae6fea61891e3e1fdf29d310c.jpg)
[groovy] closure (closure parameter binding | curry function | rcurry function | ncurry function | code example)

The principle of attention mechanism and its application in seq2seq (bahadanau attention)

AutoCAD - feature matching

AutoCAD - Document Management

AutoCAD - continuous annotation
随机推荐
Create a pyGame window with a blue background
中国溶聚丁苯橡胶(SSBR)行业研究与预测报告(2022版)
Solutions and answers for the 2021 Shenzhen cup
Observable time series data downsampling practice in Prometheus
Special information | finance, accounting, audit - 22.1.23
Fluent objects and lists
Autocad-- Real Time zoom
Neural networks and deep learning Chapter 4: feedforward neural networks reading questions
AutoCAD - Document Management
Private collection project practice sharing [Yugong series] February 2022 U3D full stack class 006 unity toolbar
中国针状焦行业发展研究与投资价值报告(2022版)
2022-2028 global and Chinese equipment as a Service Market Research Report
AutoCAD - workspace settings
Function template
[groovy] closure (Introduction to closure class closure | closure parametertypes and maximumnumberofparameters member usage)
[groovy] closure (closure call is associated with call method | call () method is defined in interface | call () method is defined in class | code example)
2021 huashubei mathematical modeling idea + reference + paper
XSS injection
[groovy] closure closure (customize closure parameters | customize a single closure parameter | customize multiple closure parameters | specify the default value of closure parameters)
AutoCAD - Zoom previous
