zoukankan      html  css  js  c++  java
  • 树之二叉树

    刚学数据结构的时候,一直不明白数据结构到底有什么用,直到对高级编程语言——Java有了进一步的认识之后,才发现数据结构的重要性,Java中的TreeMap,TreeSet等集合中包含了设计精美的数据结构,正如书中所说的那样,树是“相互之间存在一种或多种特定关系的数据元素的集合”,这种定义还是有点抽象,我的理解是“我们用来组织数据的形式”,这种形式是开放的,你可以设计自己的结构用以组织自己的数据,但是,设计良好、效率高、准确无误的数据结构还是不那么容易被设计出来的,作为小菜鸟的我也只能膜拜大神,从经典著作中总结知识了。

    树的存在形式是不确定的,如下图所示:

    正如图中所说的那样,设计一个特征具有某种规律性的树,用程序实现起来更为容易一些,毕竟,程序所做的计算都是一些重复性的东西,所以设计要有规律,使其解决的问题具有“普遍性”,否则,如果一个程序只能解决一个问题(甚至不是某一类的特定问题),那么这个程序的可用性就太差了。图中第二排“有章可循”的树具有什么特征呢?我们发现,每个结点的孩子阶段均不超过两个,为了描述这种树,我们称其为“二叉树”,二叉树的严格定义是:有限个结点的集合,这个集合或则是空的(空二叉树,没有结点的二叉树),或者由一个根节点和两颗互不相交的、分别称为左子树和右子树的二叉树组成的。这是一种递归定义,二叉树是由二叉树组成的。好晕....

    通常的二叉树的存储表示是用链式存储结构表示的,用顺序存储(数组形式)有时候太浪费空间,闲话不说了,直接创建一个完全二叉树,利用队列,按照层进行创建,如下图解释:

    根据以上提示,可以得出以下代码:

    import java.util.*;
    class TreeNode{
        public int value=-1;
        public TreeNode(int value){
            this.value=value;
        }
        public TreeNode left=null;
        public TreeNode right=null;
    }
    public class Test{
        public static void main(String[] args){
            int[] array={1,2,3,4,5,6,7,8,9};
            TreeNode root=createTree(array);
            preprint(root);
            System.out.println();
            midprint(root);
        }    
        static TreeNode createTree(int[] array){
            TreeNode root=new TreeNode(array[0]);
            List<TreeNode> contain=new ArrayList<TreeNode>();
            contain.add(root);
            TreeNode temp=null;
            int i=0,len=array.length;
            for(i=1;i<len;){
                temp=contain.remove(0);
                if(i<len){
                    temp.left=new TreeNode(array[i]);
                    i++;
                    contain.add(temp.left);
                }
                if(i<len){
                    temp.right=new TreeNode(array[i]);
                    i++;
                    contain.add(temp.right);
                }
            }
            return root;
        }
        //先序遍历
        static void preprint(TreeNode root){
            if(root!=null){
                System.out.print(root.value+" ");
                preprint(root.left);
                preprint(root.right);
            }
        }
        //中序遍历
        static void midprint(TreeNode root){
            if(root!=null){
                midprint(root.left);
                System.out.print(root.value+" ");
                midprint(root.right);
            }
        }
    }

    最后输出如下:

    1 2 4 8 9 5 3 6 7
    8 4 9 2 5 1 6 3 7

     确定一个二叉树的结构可以从先序遍历和中序遍历结果推出,也可以从后序遍历结果和中序遍历结果推出,但是不能由先序遍历结果和后序遍历结果推出来,如下图所示:

    因为二叉树的孩子有左右之分,故而不能仅有先序和后序就能判断出树的结构的。二叉树的用处很多,如红黑树、哈夫曼树均是基于二叉树构建的。

  • 相关阅读:
    为了快一点为什么却要慢一点
    大数与小数的求和算法
    Tips for newbie to read source code
    学习Data Science/Deep Learning的一些材料
    Git Sophisticated Commands
    两套JRE
    Java environment variables and their functionality
    Change Git Default Editor in Windows
    Multiton & Singleton
    Java Synchronized Blocks
  • 原文地址:https://www.cnblogs.com/codeMedita/p/7435829.html
Copyright © 2011-2022 走看看