面试题 04.09. 二叉搜索树序列
题目:
从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉树,输出所有可能生成此树的数组。
示例:
给定如下二叉树
2
/ \
1 3
返回:
[
[2,1,3],
[2,3,1]
]
解答:
不会做,后来看了题解
题目的意思是,按某种顺序依次插入所有节点(不能插入已有树的中间,只能插在最下层)。
所以对于根节点root来说,必须先插入root,root左节点left,右节点right。接下来要么插入left,要么插入right。再下一步可以插入left的左或右孩子或者right的左或右孩子。
用一个双端队列保存待选值,其中每个值都可以作为接下来插入的节点。每次用完该待选值后,放入到队列尾部,从而模拟当前节点的不同选择。
代码:
/** * 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) { if(root==nullptr){return {{}};} vector<int> cur; vector<vector<int>> res; deque<TreeNode*> que; que.push_back(root); dfs(que,res,cur); return res; } void dfs(deque<TreeNode*> que,vector<vector<int>>& res,vector<int>& cur){ if(que.empty()){ res.emplace_back(cur); return; } int siz=que.size(); while(siz>0){ auto p=que.front(); que.pop_front(); cur.emplace_back(p->val); int child_cnt=0; if(p->left){ que.push_back(p->left); ++child_cnt; } if(p->right){ que.push_back(p->right); ++child_cnt; } dfs(que,res,cur); while(child_cnt){ que.pop_back(); --child_cnt; } que.emplace_back(p); cur.pop_back(); --siz; } } };
进击的小🐴农