二叉树学习笔记

二叉树学习笔记

标签: java


完全二叉树

对于二叉树来说,还具备五种基本形态:
1.空二叉树
2.只有一个根节点
3.根节点只有左子树
4.根节点只有右子树
5.根节点有左子树和右子树

满二叉树的特点:

  1. 叶子节点都在最下一层
  2. 只有度为0和度为2的节点
  3. 一棵高为h,且有(2的h次方-1)个节点的二叉树称为满二叉树

完全二叉树的特点:

  1. 叶子结点只能出现在最下两层
  2. 最下层上的叶子结点都依次排列在该层最左边连续的位置上
  3. 如果有度为1的节点,只能有一个,且该节点只有左孩子,没有右孩子。比如F节点的度就为1,且F节点也只有一个左孩子节点。
  4. 按层编号后,一旦出现某节点(编号为i)为叶子结点或只有左孩子,则编号大于i的节点,均为叶子节点。比如对于编号为6的F节点来说,它的节点只有左孩子,因此凡是大于编号6的节点,即7 - 12都是叶子节点。
  5. 具有n个结点的完全二叉树的深度为(int)(log2n) + 1

创建二叉树实例:
第一步创建树的节点的类:

package com.octopus.BTTest;

/**
 * 创建树的节点,定义节点的数据类型,左节点和右节点
 * @author ZCX
 *
 */

public class TreeNode {
	public int data; //节点的数据类型
	
	public TreeNode left; //树的左节点
	
	public TreeNode right; //树的右节点

	public TreeNode(int data, TreeNode left, TreeNode right) { //带有左右节点的构造函数
		super();
		this.data = data;
		this.left = left;
		this.right = right;
	}

	public TreeNode(int data) { //只有数值的节点构造函数
		super();
		this.data = data;
	}

	public TreeNode() {
		super();
	}
	
}

第二步创建二叉树(带有根节点):

package com.octopus.BTTest;

/**
 * 二叉树
 * @author ZCX
 *
 */
public class BinaryTree {
	//创建根节点
	public TreeNode root;
	

第三步运用TreeNode类和BinaryTree类在运用类中创建带有多层的二叉树:

package com.octopus.BTTest;

public class TreeDemo1 {

	public static void main(String[] args) {
		BinaryTree tree = new BinaryTree(); //创建一个二叉树
		//创建左右子节点和一个根节点
		TreeNode left = new TreeNode(99);
		TreeNode right = new TreeNode(101);
		TreeNode root = new TreeNode(100, left, right); //创建一个带有左右节点的root节点
		
		tree.root = root; //把名为root的节点传给二叉树tree的root
		//再给存储数值为99的左节点创建子节点,存储数值为101的右节点创建子节点
		left.left = new TreeNode(78);
		left.right = new TreeNode(88);
		
		right.left = new TreeNode(102);
		right.right = new TreeNode(103);
	}
}

在二叉树类中创建一些实用的方法,并在运用类中使用:
第一步在上文中创建的BinaryTree类中添加插入数值到节点的方法:

/**
	 * 在保障整个树的结构不被打乱的情况下将某个数值放到合适节点(即将数值插入到某个空节点中)
	 * 数值本身的顺序:左边的节点总比父节点小,右边的节点总比父节点大,左边的节点总比右边的节点小
	 * @param data  要插入的数据
	 * @param startNode  进行比较大小的节点
	 */
	public void insertData(int data,TreeNode startNode) {
		//比较data和当前节点数值的大小,如果data比当前节点数值大或相等,数值应该插入右边节点
		//如果小于当前节点数值,则应该插入到左边节点
		if(data >= startNode.data) { //data比当前节点大,则再去与当前节点的右子节点进行比较
			if(startNode.right == null) {
				startNode.right = new TreeNode(data); //当有子节点为空时,就可以把data数值插入右子节点中
			}else { //如果右子节点有数据,则以右子节点作为当前节点,使用递归形式进行下一步的插入
				insertData(data, startNode.right);
			}
		}else { //另一种情况:data < startNode.data,这时与当前节点的左子节点进行比较
			if(startNode.left == null) {
				startNode.left = new TreeNode(data); //当有子节点为空时,就可以把data数值插入左子节点中
			}else { //如果左子节点有数据,则以左子节点作为当前节点,使用递归形式进行下一步的插入
				insertData(data, startNode.left);
			}
		}
	}
}

第二步创建一个TreeDemo2类,使用插入数值方法往二叉树中插入:

package com.octopus.BTTest;

public class TreeDemo2 {
	public static void main(String[] args) {
		BinaryTree tree = new BinaryTree(); //创建一个二叉树
		tree.root = new TreeNode(50); //根节点赋值为50
		for(int i = 0; i < 10; i++) {
			int num = (int)(Math.random() * 100);
			tree.insertData(num, tree.root); //调用插入数值方法
			}
		System.out.println("插入方法结束");
		}

}

其他一些实用方法:求二叉树总节点数,求树最大的深度,在二叉树中查找给定数值相应的节点,打印所有节点存储的数值等等,都是使用递归进行运算的,具体实现逻辑,待以后有机会补上来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值