题目:
从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉树,输出所有可能生成此树的数组。
示例:
给定如下二叉树
2
/
1 3
返回:
[
[2,1,3],
[2,3,1]
]
分析:
根据题意分析可知,插入元素的顺序必须从根节点开始插入,也就是先插入2后,才可以插入1和3。那么我们维护一个可以访问的节点列表,每轮递归都依次访问列表中的元素,当访问元素有孩子结点时,把孩子结点加入到列表中,然后再去依次访问列表中的元素,当列表为空时,表示产生了一个有效的序列,把它加入到结果集当中。注意访问结点时,要先在列表中删除掉,访问结束后记得恢复。
程序:
/** * 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) { res = new LinkedList<>(); if(root == null){ res.add(new LinkedList<>()); return res; } LinkedList<TreeNode> list = new LinkedList<>(); LinkedList<Integer> path = new LinkedList<>(); path.add(root.val); getSequences(root, list, path); return res; } private void getSequences(TreeNode root, LinkedList<TreeNode> list, LinkedList<Integer> path){ if(root == null){ return; } if(root.left != null) list.add(root.left); if(root.right != null) list.add(root.right); if(list.isEmpty()){ res.add(new LinkedList<>(path)); return; } int len = list.size(); for(int i = 0; i < len; ++i){ TreeNode cur = list.get(i); list.remove(i); path.add(cur.val); getSequences(cur, new LinkedList<>(list), path); path.removeLast(); list.add(i, cur); } } private List<List<Integer>> res; }