修剪二叉搜索树
题目理解
给一个二叉搜索树,给一个闭区间的边界,使得二叉树所有的节点值都位于区间内。
原始思路
根节点和区间的关系
1.如果根节点包含在区间里面,那么说明左边界一定在左子树,右边界一定在右子树。
向左子树遍历,找到左边界;
向右子树遍历,找到右边界。
2.如果根节点在区间外面:比左边界小或者比右边界大。如果比左边界小,开始遍历右子树的左孩子。如果比右边界大,则在左子树的有孩子里面找边界值。
代码
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==NULL) return NULL;
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;
}
};
将有序数组转化成二叉平衡搜索树
题目理解
平衡二叉树即所有节点的左右子树高度相差不超过1.
如果把有序数组转化成二叉搜索树,那么可能有不同的二叉树。限定高度为1,其解也不唯一。但是可能性没有不限定那么多。平衡二叉树的根节点一定是有序数组中间的那两个
值。至此,思路明了,找出根节点,对左边的数组构造左子树,对右边的数组构造右子树。直至root==NULL。

原因
栈内存被耗尽。
代码
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return constructTree(nums,0,nums.size()-1);
}
TreeNode* constructTree(vector<int>&nums,int left,int right){
if(left>right) return nullptr;
int mid = left+(right-left)/2;
TreeNode* root=new TreeNode(nums[mid]);
root->left = constructTree(nums,left,mid-1);
root->right = constructTree(nums,mid+1,right);
return root;
}
};
把二叉搜索树转化为累加树
题目理解
每个节点的新值等于右侧节点和自身节点的总和。
思路
要从最右边的节点开始(root->right==NULL),即最大的节点值开始。根节点的值是右节点的值加自身值,左节点的值是根节点加自身值。
代码
private:
int pre = 0;
public:
void traversal(TreeNode* root) {
if (root == NULL)
return;
traversal(root->right);
root->val += pre;
pre = root->val;
traversal(root->left);
}
TreeNode* convertBST(TreeNode* root) {
int pre = 0;
traversal(root);
return root;
}
};```
###总结
看似简单,实则写不出来。
浙公网安备 33010602011771号