不会做,后来看了题解
题目的意思是,按某种顺序依次插入所有节点(不能插入已有树的中间,只能插在最下层)。
所以对于根节点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; } } };