简单完全二叉树的实现

来源:互联网 发布:php 惠新宸 编辑:程序博客网 时间:2024/04/28 00:14
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子
树”,其次序不能随意颠倒,是有序树的一种。
二叉树主要有以下性质:
若根结点的层次为1,则二叉树第i层最多有2的(i-1)次方个结点。
在高度为k的二叉树中,则最多有2的k次方-1个结点(k≥0)
设一棵二叉树节点个数为n,则父节点个数为n/2。
一棵具有n个结点的完全二叉树,对序号为i(0≤i<n)的结点,则:
若i=0,则i为根结点,无父母结点;若i >0,则i的父母结点序号为:
若2i+1<n,则i的左孩子结点序号为2i+1;否则i无左孩子。
若2i+2<n,则i的右孩子结点序号为2i+2;否则i无右孩子。

要实现二叉树,首先我们也得先创建节点,然后再把节点连接成一颗二叉树即可。

创建节点:
public class TreeNode {private int value;private TreeNode LeftNode;private TreeNode RightNode;}

一个节点有一个值域和一个左边引用和右边引用,值域用来存放该节点的值,左右
两个引用分别用来指向它的左子树节点和右子树节点。上面的代码再加上构造函数

和set及get方法就是一个完整的树节点了。


我这里实现的是完全二叉树,完全二叉树是除最后一层外,每一层上的节点数均达
到最大值;在最后一层上只缺少右边的若干结点。
先创建一个整型数组,然后把这些整型数组都赋值到TreeNode中,
TreeNode node = new TreeNode(value,null,null);
我们也是要初始时候把左右引用赋值为null的,然后把这些节点都存储起来,再遍

历他们,给引用赋值,完成二叉树的构建。


//创建树的节点,value为一个int数组for(int i=0; i<value.length; i++){TreeNode tree_node = new TreeNode(value[i],null,null);list.add(tree_node);//添加到队列中}//把节点连接成为树,父节点个数由二叉树性质所知为size/2,但是不要包括到那//个可能没有两个子树的父节点,所以要size/2-1;for(int i=0; i<list.size()/2-1; i++){//遍历队列    TreeNode tempNode = list.get(i);//获取节点    tempNode.setLeftNode(list.get(2*i+1));//获取节点的左子树    tempNode.setRightNode(list.get(2*i+2));//获取节点右子树//左右子树依据二叉树性质得到}//完全二叉树有一个父节点有可能只有一个子节点,也可能有两个节点,所以要单独拿出来连接int nodeIndex = list.size()/2-1;//取到有变数的父节点下标TreeNode parentNode=list.get(list.size()/2-1);//拿到该父节点parentNode.setLeftNode(list.get(2*nodeIndex+1));//此节点一定有左子节点if(list.size()%2==1){//如果节点总数为奇数,表示该父节点还有右子节点parentNode.setRightNode(list.get(2*nodeIndex+2));}


以上就是我们创建一个完全二叉树的过程,要检验我们创建的是否是对的,就要遍
历该二叉树,查看数据是否是对的。
二叉树的遍历有三种方式,先序遍历,中序遍历,后序遍历,
分别为以下解释;
先序遍历树:先访问根节点,然后访问左子树,最后访问右子树
中序遍历树:先访问左子树,然后访问根节点,最后访问右子树
后续遍历树:先访问左子树,然后访问右子树,最后访问根节点
我通过先序遍历检验该树的创建是对的,方法如下:


public void firstSearch(TreeNode root){//传入树根节点if(root == null){//如果根节点为空return;}System.out.print(root.getValue()+",");//输出该节点值firstSearch(root.getLeftNode());//递归获取左节点firstSearch(root.getRightNode());//递归获取右节点}


通过递归调用我们方便的遍历了整个二叉树,也检验我的二叉树的创建没有问题;

中序遍历就是把先序遍历的输出语句移到递归获取左节点的下一句执行即可,

后序遍历就是把线序遍历的输出语句移到最后一句执行即可。

0 0