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();
}
};