题
从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。
给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。
示例 1:
输入: root = [2,1,3]
输出: [[2,1,3],[2,3,1]]
解释: 数组 [2,1,3]、[2,3,1] 均可以通过从左向右遍历元素插入树中形成以下二叉搜索树
2
/ \
1 3
示例 2:
输入: root = [4,1,null,null,3,2]
输出: [[4,1,3,2]]
提示:
二叉搜索树中的节点数在 [0, 1000] 的范围内
1 <= 节点值 <= 10^6
用例保证符合要求的数组数量不超过 5000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bst-sequences-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
百度一下 回溯法
代码
class Solution
{
public:
vector<int> path;
deque<TreeNode *> optionDeque;
vector<vector<int>> result;
vector<vector<int>> BSTSequences(TreeNode *root)
{
optionDeque.push_back(root);
if(!root)
return {{}};
dfs();
return result;
}
void dfs(){
if (optionDeque.empty())
{
result.push_back(path);
return;
}
int size=optionDeque.size();
//注意这地方要提前拿出size 因为 遍历大小 在循环体会变化
for (int i = 0; i < size; i++)
{
auto node = optionDeque.front();
optionDeque.pop_front();
path.push_back(node->val);
if (node->left)
optionDeque.push_back(node->left);
if (node->right)
optionDeque.push_back(node->right);
dfs();
//到这个地方 第i个节点已经选完 将optionDeque还原 和 path还原
path.pop_back();
if (node->left)
optionDeque.pop_back();
if (node->right)
optionDeque.pop_back();
//注意 这个已遍历的数据 放在最后面! 而且要先删除left right
optionDeque.push_back(node);
}
}
};