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又和区别。

Posted by richard爱闹 - 7月 26 2014
如需转载,请注明: 本文来自 Richard