1、669修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。
我的思路: 使用构造二叉树的遍历框架。节点的左子树一定小于节点,所以如果这个节点值小于下界low则遍历右子树。节点的右子树一定大于节点,所以如果这个节点值大于上界high则遍历左子树。
代码随想录

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr)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;
}
};

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

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡二叉搜索树
平衡二叉搜索树:指该树所有节点的左右子树的高度相差不超过 1。

我的思路:没做出来。
代码随想录:以中间节点作为根节点构建的二叉树就是平衡二叉搜索树。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 理解了之后我写的
class Solution {
public:
TreeNode* traverse(vector<int>& nums,int start, int end) {
if(start > end)return nullptr;
int index = (start+end)/2;
TreeNode* root = new TreeNode(nums[index]);
root->left = traverse(nums,start,index-1);
root->right = traverse(nums,index+1,end);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traverse(nums,0,nums.size()-1);
}
};

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

给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

我的思路:要保证所有元素大于或等于原来的值之和。只需要从右往左中序遍历累加即可。可以用构造二叉树的框架,也可以用遍历二叉树的框架。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 我的
class Solution {
public:
TreeNode* traverse(TreeNode* root, int &lastval) {
if(root == nullptr)return root;
root->right = traverse(root->right,lastval);
root->val += lastval; //中
lastval = root->val;
root->left = traverse(root->left,lastval);
return root;
}
TreeNode* convertBST(TreeNode* root){
int lastval = 0;
return traverse(root,lastval);
}
};
// 代码随想录
class Solution {
private:
int pre = 0; // 记录前一个节点的数值
void traversal(TreeNode* cur) { // 右中左遍历
if (cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};

代码随想录二叉树总结