用java创建一棵二叉树_java创建二叉树

本文介绍了如何使用Java创建非完全、完全和满二叉树。通过递归方法`recurCreateFullBiTree`和`recurCreateBinTree`,分别根据节点总数和给定数组构建二叉树,并提供了获取树大小和最左边节点的方法。
摘要由CSDN通过智能技术生成

/**

* 创建非完全二叉树、完全二叉树、满二叉树

*

* 由于二叉树的节点增加没有什么规则,所以这里只是简单的使用了递一

* 次性把整棵树创建出来,而没有设计出一个一个添加节点的方法与删除

* @author jzj

* @date 2009-12-23

*/

public class BinTree {// Bin=Binary(二进位的, 二元的)

protected Entry root;//根

private int size;//树的节点数

/**

* 树的节点结构

* @author jzj

* @date 2009-12-23

*/

protected static class Entry {

int elem;//数据域,这里我们作为编号

Entry left;//左子树

Entry right;//右子树

public Entry(int elem) {

this.elem = elem;

}

public String toString() {

return " number=" + elem;

}

}

/**

* 根据给定的节点数创建一个完全二叉树或是满二叉树

* @param nodeCount 要创建节点总数

*/

public void createFullBiTree(int nodeCount) {

root = recurCreateFullBiTree(1, nodeCount);

}

/**

* 递归创建完全二叉树

* @param num 节点编号

* @param nodeCount 节点总数

* @return TreeNode 返回创建的节点

*/

private Entry recurCreateFullBiTree(int num, int nodeCount) {

size++;

Entry rootNode = new Entry(num);//根节点

//如果有左子树则创建左子树

if (num * 2<= nodeCount) {

rootNode.left = recurCreateFullBiTree(num * 2, nodeCount);

//如果还可以创建右子树,则创建

if (num * 2+ 1<= nodeCount) {

rootNode.right = recurCreateFullBiTree(num * 2+ 1, nodeCount);

}

}

return (Entry) rootNode;

}

/**

* 根据给定的数组创建一棵树,这个棵树可以是完全二叉树也可是普通二叉树

* 数组中为0的表示不创建该位置上的节点

* @param nums 数组中指定了要创建的节点的编号,如果为0,表示不创建

*/

public void createBinTree(int[] nums) {

root = recurCreateBinTree(nums, 0);

}

/**

* 递归创建二叉树

* @param nums 数组中指定了要创建的节点的编号,如果为0,表示不创建

* @param index 需要使用数组中的哪个元素创建节点,如果为元素为0,则不创建

* @return TreeNode 返回创建的节点,最终会返回树的根节点

*/

private Entry recurCreateBinTree(int[] nums, int index) {

//指定索引上的编号不为零上才需创建节点

if (nums[index] != 0) {

size++;

Entry rootNode = new Entry(nums[index]);//根节点

//如果有左子树则创建左子树

if ((index + 1) * 2<= nums.length) {

rootNode.left = (Entry) recurCreateBinTree(nums, (index + 1) * 2- 1);

//如果还可以创建右子树,则创建

if ((index + 1) * 2+ 1<= nums.length) {

rootNode.right = (Entry) recurCreateBinTree(nums, (index + 1) * 2);

}

}

return (Entry) rootNode;

}

return null;

}

public int size() {

return size;

}

//取树的最左边的节点

public int getLast() {

Entry e = root;

while (e.right != null) {

e = e.right;

}

return e.elem;

}

//测试

public static void main(String[] args) {

//创建一个满二叉树

BinTree binTree = new BinTree();

binTree.createFullBiTree(15);

System.out.println(binTree.size());//15

System.out.println(binTree.getLast());//15

//创建一个完全二叉树

binTree = new BinTree();

binTree.createFullBiTree(14);

System.out.println(binTree.size());//14

System.out.println(binTree.getLast());//7

//创建一棵非完全二叉树

binTree = new BinTree();

int[] nums = new int[] {1, 2, 3, 4, 0, 0, 5, 0, 6, 0, 0, 0, 0, 7, 8};

binTree.createBinTree(nums);

System.out.println(binTree.size());//8

System.out.println(binTree.getLast());//8

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值