树结构练习

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Created by itworker365 on 5/10/2017.
 */
public class BinaryTree {
    public static void main (String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);

        BinaryTree bt = new BinaryTree();
        TreeNode tree = bt.buildTreeAsList(list, null, 0);
        bt.printTreeLevelTrace(tree);
    }
    /**
     * 按照LIST顺序构建完全二叉树
     * */
    public TreeNode buildTreeAsList (List<Integer> list, TreeNode root, int pos) {
        if (root == null) {
            root = new TreeNode(list.get(0), null, null);
        }
        int listSize = list.size();
        int leftPos = pos * 2 + 1;
        int rightPos = pos * 2 + 2;
        if (pos == listSize) {
            return root;
        } else {
            // build left
            if (leftPos < listSize) {
                TreeNode nodeLeft = new TreeNode(list.get(leftPos), null, null);
                root.setLeft(nodeLeft);
                buildTreeAsList(list, nodeLeft, leftPos);
            }
            // build right
            if (rightPos < listSize){
                TreeNode nodeRight = new TreeNode(list.get(rightPos), null, null);
                root.setRight(nodeRight);
                buildTreeAsList(list, nodeRight, rightPos);
            }
        }
        return root;
    }
    // 前序遍历, 根-》左-》右
    private void printTreePreOrderRec (TreeNode root) {
        if (root != null) {
            System.out.println(root.value);
            printTreePreOrderRec(root.getLeft());
            printTreePreOrderRec(root.getRight());
        }
    }

    // 中序遍历, 左-》根-》右
    private void printTreeMidOrderRec (TreeNode root) {
        if (root != null) {
            printTreeMidOrderRec(root.getLeft());
            System.out.println(root.value);
            printTreeMidOrderRec(root.getRight());
        }
    }

    // 后序遍历, 左-》右-》根
    private void printTreePostOrderRec (TreeNode root) {
        if (root != null) {
            printTreePostOrderRec(root.getLeft());
            printTreePostOrderRec(root.getRight());
            System.out.println(root.value);
        }
    }

    // 层序遍历
    private void printTreeLevelTrace (TreeNode root) {
        Queue<TreeNode> queue = new LinkedBlockingQueue<>();
        if (root == null) {
            return;
        }
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            System.out.println(node.getValue());
            if (node.getLeft() != null) {
                queue.offer(node.getLeft());
            }
            if (node.getRight() != null) {
                queue.offer(node.getRight());
            }
        }
    }

    //  只打印叶子结点
    private void printTreeLefeRec (TreeNode root) {
        if (root.getLeft() == null || root.getRight() == null) {
            System.out.println(root.getValue());
        } else {
            printTreeMidOrderRec(root.getLeft());
            printTreeMidOrderRec(root.getRight());
        }
    }
    static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;

        public TreeNode(int value, TreeNode left, TreeNode right) {
            this.value = value;
            this.left = left;
            this.right = right;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public TreeNode getLeft() {
            return left;
        }

        public void setLeft(TreeNode left) {
            this.left = left;
        }

        public TreeNode getRight() {
            return right;
        }

        public void setRight(TreeNode right) {
            this.right = right;
        }
    }
}
时间: 2024-10-25 15:48:28

树结构练习的相关文章

树结构在程序设计中的运用

                                                                                引言 近年来,由于各种竞赛纷纷采用free-pascal,因此对于算法来说,空间效率上的要求降低了,而对时间效率却提出了更高的要求.这使得选手不仅要娴熟地掌握常规算法,而且要大胆创新,构造更高效的算法来解决问题. 在以往的程序设计中,链式结构采用得较多.的确链式结构有编程复杂度低.简单易懂等优点,但有一个致命的弱点:相邻的两个元素间的联系

oracle分层查询中的start with和connect by(树结构查询)

来源:  http://blog.csdn.net/itmyhome1990/article/details/16338637 ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型 结构的联系. 例如有如下案例: 数据为节选,字段值含义分别为税务机构代码.税务机构名称.上级税务机构代码,税务机构级别 select * from extern_dm_swjg查询的时候默认顺序就是上面的顺序,可以看出是混乱的并没有特殊结构特征. 而希望的结果如下图: sj_swj

第一章: 在RDB中的树结构数据

第一章: 在RDB中的树结构数据 在本章中,我将写一个基本的知识来理解这个问题 一  模型的作用 RBD处理树模型的作用总结为两点: 1  在RDB表中保存树的数据 2  效率的查询节点的相关节点 1  在RDB表中保存树的数据 我们可以定义的标准,该模型是否具有存储层次数据的功能 可以由保存的所有节点再现原有的层次结构 如果不能通过保存的数据再现原有的树结构,就不能说这个模型实现了树. 2  效率的查询节点的相关节点 通常,我们将数据保存到数据库中进行搜索,数据中保存了分层数据,可能会查询任何

用dfs序维护树结构

给定一棵n个节点的树,m次查询,每次查询需要求出某个节点深度为h的所有子节点. 对于这个问题如果试图去对每个节点保存所有深度的子节点,在数据大的时候内存会吃不消:或者每次查询的时候去遍历一遍,当数据大的时候,时间效率会非常低. 此时如果使用dfs序维护树结构就可以轻松地解决这个问题. 作为预处理,首先将将树的所有节点按深度保存起来,每个深度的所有节点用一个线性结构保存,每个深度的节点相对顺序要和前序遍历一致. 然后从树的根节点进行dfs,对于每个节点记录两个信息,一个是dfs进入该节点的时间戳i

索引深入浅出:非聚集索引的B树结构在聚集表

一个表只能有一个聚集索引,数据行以此聚集索引的顺序进行存储,一个表却能有多个非聚集索引.我们已经讨论了聚集索引的结构,这篇我们会看下非聚集索引结构. 非聚集索引的逻辑呈现 简单来说,非聚集索引是表的子集.当我们定义了一个非聚集索引时,SQL Server把整套非聚集索引键存在不同的页里.我们来看下一个包含BusinessEntityID(PK),PersonType,FirstName,LastName这4列的表,这个表上有一个非聚集索引定义.主体表按BusinessEntityID列(聚集索引

一行python代码实现树结构

树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题中所说的那样,用一行Python代码就可以实现吗? 一行代码实现? 由于树形结构的外层和内层有着相似的结构,所以多可以用递归的方式定义树.再利用Python中提供的defaultdict,我们就可以很轻松地定义树了,而且只有一行代码. from collections import defaultd

asp.net mvc+EF 递归生成树结构返回json

0.数据表结构,主要属性有:Id.parentId(父节Id).Text.Url……等等. 1.新建一个树结构MenuModels 1 public class MenuModels 2 { 3 private int _id; 4 private string _text; 5 private int? _parentid; 6 private string _icon; 7 private string _url; 8 private object _menus; 9 private Dic

react+redux教程(五)异步、单一state树结构、componentWillReceiveProps

教程目录 react+redux教程(一)connect.applyMiddleware.thunk.webpackHotMiddleware react+redux教程(二)redux的单一状态树完全替代了react的状态机? react+redux教程(三)reduce().filter().map().some().every()....展开属性 react+redux教程(四)undo.devtools.router react+redux教程(五)异步.单一state树结构.compo

Android应用源代码ListView实现的文件夹树结构

Android应用源代码ListView实现的文件夹树结构 点击加号能够展开,点击减号能够收起这一个节点 源代码下载地址:http://download.csdn.net/detail/kiduo08/7711711

数据结构编程实验——chapter8-采用树结构的非线性表编程

关于树结构的非线性表编程在数据结构中可以说占据了半壁江山,其中涉及的知识点繁杂,但也是数据结构体现运算优化的核心所在,下面我们将较为初步且系统得讨论数据结构中一系列有关树的表示. 首先我们再次明确树的形式化概念: 树是n个节点的有限集合,这个集合满足以下的条件: 1)     有且仅有一个节点没有前件. 2)     除根外,其他的所有节点都有且仅有一个前件. 3)     除去根以外,其他每个节点都通过唯一的路径连接根上.每个节点的前件称为该节点的父节点,后件称为该节点的子节点. 这篇文章主要