总结
主要是回顾了二叉搜索树、平衡二叉树等概念,二叉搜索树的中序遍历可以得到一个升序的数组
题目I
题解
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size()==0){
return NULL;
}
int mid=nums[(nums.size()-1)/2];
TreeNode* p=new TreeNode(mid);
vector<int> leftPart;
for(int i=0;i<(nums.size()-1)/2;i++){
leftPart.push_back(nums[i]);
}
vector<int> rightPart;
for(int i=((nums.size()-1)/2)+1;i<nums.size();i++){
rightPart.push_back(nums[i]);
}
if(leftPart.size()!=0){
p->left=sortedArrayToBST(leftPart);
}
if(rightPart.size()!=0){
p->right=sortedArrayToBST(rightPart);
}
return p;
}
感想
二叉搜索树是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
先序遍历:根节点—》左子树----》右子树
中序遍历:左子树—》根节点—》右子树
后序遍历:左子树—》右子树—》根节点
此题目中的“平衡”,要求在数组中间部分取root节点,这样就可以保证左右子树的高度相同或只相差 1
题目II
解法
TreeNode* balanceBST(TreeNode* root) {
vector<int> temp;
vector<int> sortedVector=traverse(root,temp);
return balance(sortedVector);
}
vector<int> traverse(TreeNode* p,vector<int>& v){
if(p->left!=NULL){
traverse(p->left,v);
}
v.push_back(p->val);
if(p->right!=NULL){
traverse(p->right,v);
}
return v;
}
TreeNode* balance(vector<int> sortedVector){
int mid=sortedVector[(sortedVector.size()-1)/2];
TreeNode* p=new TreeNode(mid);
vector<int> leftPart;
vector<int> rightPart;
for(int i=0;i<(sortedVector.size()-1)/2;i++){
leftPart.push_back(sortedVector[i]);
}
for(int i=((sortedVector.size()-1)/2)+1;i<sortedVector.size();i++){
rightPart.push_back(sortedVector[i]);
}
if(leftPart.size()!=0){
p->left=balance(leftPart);
}
if(rightPart.size()!=0){
p->right=balance(rightPart);
}
return p;
}
感想
是第一道题的应用,先中序遍历二叉搜索树,可以得到一个升序排列的数组,然后再根据这个数组生成一个平衡二叉搜索树(结果不唯一