树之二叉树

Posted Judy518

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树之二叉树相关的知识,希望对你有一定的参考价值。

刚学数据结构的时候,一直不明白数据结构到底有什么用,直到对高级编程语言——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

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

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

以上是关于树之二叉树的主要内容,如果未能解决你的问题,请参考以下文章

二叉树之二叉搜索树的基本操作实现

树之二叉树

数据结构 - 从二叉搜索树说到AVL树之二叉搜索树的操作与详解(Java)

数据结构(12)---二叉树之顺序结构

二叉树之结点相关操作

二叉树之红黑树(RBTree)