程序员面试金典 4.9

BST Sequences:给定一个二叉搜索树,计算所有可以形成该二叉搜索树的数组。

根据二叉搜索树的性质,根一定是数组的首元素,而子树中所有节点也必须满足这个性质,因此可以先将左子树中的所有结果lSeq计算出来,然后再将右子树中的所有结果计算出来rSeq,最后以root->val作为数组首元素,在不改变lSeq[i]rSeq[j]中元素相对顺序的情况下,深搜计算所有可能的数组。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> BSTSequences(TreeNode* root) {
        vector<vector<int>> allSeq;
        enumBSTSequences(root, allSeq);
        return allSeq;
    }
private:
    void enumBSTSequences(TreeNode* root, vector<vector<int>> &allSeq)
    {
        if(root == nullptr){
            allSeq.push_back(vector<int>());
            return;
        }
        vector<vector<int>> lSeq, rSeq;
        enumBSTSequences(root->left, lSeq);
        enumBSTSequences(root->right, rSeq);
        vector<int> lstPre(1, root->val);
        for(size_t i = 0; i < lSeq.size(); i++)
        {
            for(size_t j = 0; j < rSeq.size(); j++)
            {
                weave(lSeq[i], 0, rSeq[j], 0, lstPre, allSeq);
            }
        }
    }
    void weave(vector<int> &lSeq, size_t lIdx, vector<int> &rSeq, size_t rIdx, vector<int> &lstPre, vector<vector<int>> &allSeq)
    {
        if(lIdx == lSeq.size() || rIdx == rSeq.size()){
            allSeq.push_back(lstPre);
            while(lIdx != lSeq.size())
                allSeq.back().push_back(lSeq[lIdx++]);
            while(rIdx != rSeq.size())
                allSeq.back().push_back(rSeq[rIdx++]);
            return;
        }

        lstPre.push_back(lSeq[lIdx]);
        weave(lSeq, lIdx + 1, rSeq, rIdx, lstPre, allSeq);
        lstPre.pop_back();

        lstPre.push_back(rSeq[rIdx]);
        weave(lSeq, lIdx, rSeq, rIdx + 1, lstPre, allSeq);
        lstPre.pop_back();
    }
};
发布了194 篇原创文章 · 获赞 2 · 访问量 7731

猜你喜欢

转载自blog.csdn.net/RayoNicks/article/details/105330688
4.9