程序员面试金典-面试题 04.09. 二叉搜索树序列

题目:

从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉树,输出所有可能生成此树的数组。

示例:
给定如下二叉树

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;
}

 

posted @ 2020-03-07 14:29  silentteller  阅读(355)  评论(0编辑  收藏  举报