题目描述
描述:从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。
给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。
输入: root = [2,1,3]
输出: [[2,1,3],[2,3,1]]
解释: 数组 [2,1,3]、[2,3,1] 均可以通过从左向右遍历元素插入树中形成以下二叉搜索树
2
/ \
1 3
输入: root = [4,1,null,null,3,2]
输出: [[4,1,3,2]]
二叉搜索树中的节点数在 [0, 1000] 的范围内
1 <= 节点值 <= 10^6
用例保证符合要求的数组数量不超过 5000
解题思路
思路1:最直观的想法是,当前节点只能在其孩子节点以及其兄弟节点前面出现。使用deque存储下一个可供选择的节点,其为层次遍历得到的结果,整个过程需要使用回溯。
vector<int> path; //当前路径
vector<vector<int>> res; //结果路径
vector<vector<int>> BSTSequences(TreeNode* root)
{
if (!root) return {{}}; //空树
deque<TreeNode*> dq; //双端队列
dq.push_back(root);
dfs(dq);
return res;
}
void dfs(deque<TreeNode*>& dq)
{
//空队列收集结果
if (dq.empty())
{
res.push_back(path);
return;
}
//dq存储下一个可供选择的节点
int size = dq.size();
//层次遍历
for (int i = 0; i < size; i++)
{
TreeNode* node = dq.front();
dq.pop_front();
// 将当前值加入path
path.push_back(node -> val);
// 将当前节点的子节点加入选择节点
if (node -> left) dq.push_back(node -> left);
if (node -> right) dq.push_back(node -> right);
// 下一轮递归
dfs(dq);
// 回溯选择列表
if (node -> left) dq.pop_back();
if (node -> right) dq.pop_back();
// 把加入的子节点pop出后,还要将当前节点重新加入选择列表
dq.push_back(node);
// 回溯path
path.pop_back();
}
}