从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树,输出所有可能生成此树的数组。
示例:
给定如下二叉树
2
/ \
1 3
返回:
[
[2,1,3],
[2,3,1]
]
思路:自己写的代码较丑,参考了一下他人的写法。
class Solution {
public List<List<Integer>> BSTSequences(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if (root == null) {
list.add(new ArrayList<>());
return list;
}
Deque<TreeNode> q = new LinkedList<>();
q.add(root);
List<Integer> buf = new ArrayList<>();
List<List<Integer>> ans = new ArrayList<>();
Inner(q, buf, ans);
return ans;
}
private void Inner(Deque<TreeNode> q, List<Integer> buf, List<List<Integer>> ans) {
if (q.isEmpty()) {
ans.add(new ArrayList<>(buf));
return;
}
int size = q.size();
while (size-- > 0) {
TreeNode now = q.pollFirst();
buf.add(now.val);
int child = 0;
if (now.left != null) {
++child;
q.addLast(now.left);
}
if (now.right != null) {
++child;
q.addLast(now.right);
}
Inner(q, buf, ans);
while (child-- > 0)
q.pollLast();
q.addLast(now);
buf.remove(buf.size() - 1);
}
}
}