二叉树学习笔记
标签: java
对于二叉树来说,还具备五种基本形态:
1.空二叉树
2.只有一个根节点
3.根节点只有左子树
4.根节点只有右子树
5.根节点有左子树和右子树
满二叉树的特点:
- 叶子节点都在最下一层
- 只有度为0和度为2的节点
- 一棵高为h,且有(2的h次方-1)个节点的二叉树称为满二叉树
完全二叉树的特点:
- 叶子结点只能出现在最下两层
- 最下层上的叶子结点都依次排列在该层最左边连续的位置上
- 如果有度为1的节点,只能有一个,且该节点只有左孩子,没有右孩子。比如F节点的度就为1,且F节点也只有一个左孩子节点。
- 按层编号后,一旦出现某节点(编号为i)为叶子结点或只有左孩子,则编号大于i的节点,均为叶子节点。比如对于编号为6的F节点来说,它的节点只有左孩子,因此凡是大于编号6的节点,即7 - 12都是叶子节点。
- 具有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("插入方法结束");
}
}
其他一些实用方法:求二叉树总节点数,求树最大的深度,在二叉树中查找给定数值相应的节点,打印所有节点存储的数值等等,都是使用递归进行运算的,具体实现逻辑,待以后有机会补上来。