SortedArrayToBST
一开始看这道题目,典型的两种DS之间的转化。
两种思路,一种是先随便插入,例如从前向后,或者后向前,然后update BT为BST,另一种就是按照特定的元素访问顺序插入, 使得查完刚好为BST。
思路1,插入采用BST的插入算法,然后调整为BBST,但是调整为BBST似乎算法挺烦,看AC率挺高,估计不是放弃。
思路2,似乎有点像二分的顺序,插入就可以,先mid然后左区mid,然后右区mid,然后左左区mid一直下去,但是代码不好控制成这种顺序的。
后来想想,发现有这思路忘记了,就是recursive,遇到BT问题,recursive都是最好理解算法,虽然执行过程不make sense,于是开始递归了。按照二分思路,下插入中间
因此需要申请一个结点为根,然后递归插入左区,递归插入右区,需要上下断点 ,原函数参数不行,因此重新写一个,里面有new,想起之前先序顺序简历二叉树的心得,一定要引用传递指针,不然
堆空间的地址丢了,发现空数组又忘记处理= =附上代码
class Solution {
public:
TreeNode *sortedArrayToBST(vector<int> &num) {
if(num.size()==0) return NULL;
TreeNode* root;
f(root,num ,0, num.size()-1);
return root;
}
void f(TreeNode*& root, vector<int>&num, int low, int high)
{
if(low>high)
return;
else
{
int mid=(low+high)/2;
root=new TreeNode(num[mid]);
f(root->left, num, low,mid-1);
f(root->right, num, mid+1, high);
}
}
};
总结一下,现在还是不那么全面,三个流程缺一不可,任意一个DS alg题都要有这三步:
1)想出最优算法,写代码
2)检查代码边界,无非是访问数组越界,字符串越界,访问结构体成员指针知否空,stack空的pop之类的
3)检查特殊输入case是否可以统一到一般的算法流程里,不然单独处理
但是这里有个疑惑,二叉搜索树调整为平衡的,和普通BT调整为balanced又和区别。