今天是二叉树的最后一部分,开冲!!!
今日任务:
- 669.修建二叉搜索树
- 108.将有序数组转换为二叉搜索树
- 538.把二叉搜索树转为累加树
- 总结篇
题目一:669.修剪二叉搜索树
Leetcode题目:【669.修剪二叉搜索树】
思路:
1、终止条件:节点为NULL,因为一定要遍历完整棵树才可以,这个与上面做的删除特定节点题不同
2、内容处理:
(1)如果节点的值比low小了,应该往右查找(因为左侧会更小,一定会被删除的,这就用到了二叉搜索树的特性了);
(2)节点值如果比high大了,应该往左查找(因为右边的节点一定是不符合情况的)。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == NULL) return root;
if(root -> val < low){
TreeNode* right = trimBST(root -> right, low, high);
return right;
}else if(root -> val > high){
TreeNode* left = trimBST(root -> left, low, high);
return left;
}
root -> left = trimBST(root -> left, low, high);
root -> right = trimBST(root -> right, low, high);
return root;
}
};
一次性AC了,牛逼!!!
题目二:108.将有序数组转换为二叉搜索树
Leetcode题目:【108.将有序数组转换为二叉搜索树】
题目中需要构造平衡二叉搜索树:
一般我们如何去构造二叉树呢?
(1)选取一个中间节点,将数组分为两个区间;
(2)递归去遍历左区间,构成左子树;
(3)递归遍历右区间,构成右子树。
注意此题的终止条件为left > right(左区间的值大于右区间的值)
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right){
if(left > right) return NULL;
int mid = (left + right)/2;
TreeNode* node = new TreeNode(nums[mid]);
node -> left = traversal(nums, left, mid - 1);
node -> right = traversal(nums, mid + 1, right);
return node;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums, 0, nums.size() - 1);
}
};
题目三:538.把二叉搜索树转为累加树
Leetcode题目:【538.把二叉搜索树转为累加树】
class Solution {
public:
int pre = 0;
TreeNode* convertBST(TreeNode* root) {
// 按照右、中、左的顺序进行遍历
if(root == NULL) return NULL;
convertBST(root -> right);
root -> val += pre;
pre = root -> val;
convertBST(root -> left);
return root;
}
};