@ 代码随想录算法训练营第4周(C语言)|Day23(二叉树)
Day23、二叉树(包含题目 ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 )
669. 修剪二叉搜索树
题目描述
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
题目解答
struct TreeNode* trimBST(struct TreeNode* root, int low, int high) {
if(root==NULL){
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;
}
题目总结
可以通过递归函数的返回值来移除节点。
108.将有序数组转换为二叉搜索树
题目描述
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
题目解答
struct TreeNode*sortedArrayToBST1(int*nums,int left,int right){
if(left>right){
return NULL;
}
int mid=left+(right-left)/2;
struct TreeNode*root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val=nums[mid];
root->left=sortedArrayToBST1(nums,left,mid-1);
root->right=sortedArrayToBST1(nums,mid+1,right);
return root;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {
return sortedArrayToBST1(nums,0,numsSize-1);
}
题目总结
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。。
538.把二叉搜索树转换为累加树
题目描述
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
题目解答
int pre=0;
void convertBST1(struct TreeNode* root){
if(root==NULL){
return;
}
convertBST1(root->right);
root->val+=pre;
pre=root->val;
convertBST1(root->left);
}
struct TreeNode* convertBST(struct TreeNode* root) {
pre=0;//在进行函数调用之前先初始化,不然就只有第一次是对的!!!
convertBST1(root);
return root;
}
题目总结
无