zoukankan      html  css  js  c++  java
  • 程序员面试金典-面试题 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;
    }
  • 相关阅读:
    shell脚本编程
    Linux系统C语言开发环境学习
    Linux系统用户管理及VIM配置
    实验二 Linux系统简单文件操作命令
    实验一 Linux系统与应用准备
    DS01-线性表
    c博客作业 指针
    C博客06-2019-结构体&文件
    c语言博客作业04 数组
    c语言博客作业03 函数
  • 原文地址:https://www.cnblogs.com/silentteller/p/12434101.html
Copyright © 2011-2022 走看看