题目:
思路:
首先明确的一个点:根结点的顺序是不会变的!!变的是孩子结点的顺序
再思考可以怎么变顺序,注意搜索树的性质!!要保证树是一样的,那么结点大小相关关系就不能变
比如:
当确定了6和10后,下一层无论那个结点进来构建树,都能找到正确的位置都不会造成影响,这就是相对关系
序列问题,自然想到回溯法
如何保证相关关系?用一个队列来保存再配合回溯。
代码中关键部分都有注释
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> BSTSequences(TreeNode root) {
if(root != null){
queue.add(root);
}else {
List<Integer> list = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
result.add(list);
return result;
}
//队列
List<TreeNode> queue = new ArrayList<>();
//临时结果
List<Integer> temp = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
process(queue, temp, result);
return result;
}
public void process(List<TreeNode> queue, List<Integer> temp, List<List<Integer>> result){
if (queue.isEmpty()){
//注意要new一个
result.add(new ArrayList<>(temp));
return;
}
for (int i = 0; i < queue.size(); i++) {
//拿出来
TreeNode node = queue.get(i);
//从队列中去掉
queue.remove(node);
//
if (node.left != null){
queue.add(node.left);
}
if (node.right != null){
queue.add(node.right);
}
//临时结果集添加
temp.add(node.val);
process(queue, temp, result);
temp.remove(temp.size()-1);
//从什么位置(位置i)拿出来的重新放回原位置
queue.add(i, node);
//本node在当前位置的排序已经结束,所以它的孩子结点都应去掉
queue.remove(node.left);
queue.remove(node.right);
}
}
}