一、题目介绍
从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树,输出所有可能生成此树的数组。
示例:
给定如下二叉树
2
/ \
1 3
返回:
[
[2,1,3],
[2,3,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bst-sequences-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
本题相当于变相考察全排列,采用的方式为“回溯+递归+双端队列”,该方法自己没有想出来,借鉴他人的,在这里记录一下。
三、解题代码
class Solution {
public:
vector<vector<int>> BSTSequences(TreeNode* root) {
vector<vector<int>> res;
if(!root)
return {{}};
vector<int> ans;
deque<TreeNode*> q;
q.push_back(root);
dfs(ans, res, q);
return res;
}
void dfs(vector<int>& ans, vector<vector<int>> &res, deque<TreeNode*>& q)
{
if(q.empty())
{
res.push_back(ans);
return;
}
for(int i = q.size(); i > 0; --i)
{
TreeNode* cur = q.front();
q.pop_front();
ans.push_back(cur->val);
int count = 0;
if(cur->left)
{
q.push_back(cur->left);
++count;
}
if(cur->right)
{
q.push_back(cur->right);
++count;
}
dfs(ans, res, q);
for(int j = 0; j < count; ++j)
q.pop_back();
ans.pop_back();
q.push_back(cur);
}
}
};