文章目录

  • 二叉树
  • 1. 树的基础知识
  • 2. 树的表示方法
  • 3. 什么是二叉树
  • 3.1 二叉树的分类
  • 3.2 二叉树的性质
  • 4. C语言下的二叉树的创建
  • 4.1 二叉树的二叉链表存储
  • 4.2 创建二叉树
  • 4.3 例子
  • 4.4 运行视图
  • 5. Java语言下的二叉树的创建
  • 5.1 构造根节点
  • 5.2 构建二叉树
  • 5.3 源码


二叉树

1. 树的基础知识

  • 树型结构是一种非线性的数据结构,是以分支关系定义的层次结构。
  • 根节点:没有前驱
  • 树应该用节点
  • 2度:有2个分支,依次类推
  • 树的度 = Max{度}
  • 节点层次:根在第1层,根的孩子在第2层,类推。
  • 树的深度 = Max{层次}
  • 森林:互不相交树的集合
  • 叶子节点:度为零的节点

2. 树的表示方法

二叉树可视化Java java二叉树数据结构_二叉链表

3. 什么是二叉树

  • 每个节点至多只有两课子树(不存在度大于2的节点)。
  • 二叉树的子树有左右之分,其次序不能任意颠倒。

3.1 二叉树的分类

二叉树可视化Java java二叉树数据结构_二叉链表_02


3.2 二叉树的性质

  1. 在二叉树的第 i 层至多有 2 的 i-1 次方个节点(i>=1)
  2. 深度为 k 的二叉树至多有 2 的 k 次方减 1 个节点
  3. n0 = n2 + 1
求证: n0 = n2 + 1

证明:
n = n0 + n1 + n2
设 B 为二叉树的分支树
n = B + 1
B = n1 + 2n2
所以:n = n1 + 2n2 + 1
得:n0 = n2 + 1
  1. 满二叉树:每一层节点数都达到最大,不存在只有左节点。(一颗深度为 k 且有 2 的 k 次方减 1 个节点的二叉树)。
  2. 完全二叉树:有右节点,则必有左节点。(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。)
  3. 分支数 = 节点数 - 1

4. C语言下的二叉树的创建

4.1 二叉树的二叉链表存储

// 二叉树的二叉链表存储表示
typedef struct BiTNode {
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

4.2 创建二叉树

void CreateBiTree(BiTree &T) {
	// 分配空间
	T = (BiTree)malloc(sizeof(BiTNode));
	
	// 整型元素
	int data;
	scanf("%d",&data);
	if(data == -1) T = NULL;
	if(T) {
		T->data = data;
		printf("输入%d节点的左子节点:\n",data);
		CreateBiTree(T->lchild);
		printf("输入%d节点的右子节点:\n",data);
		CreateBiTree(T->rchild);		 
	} // end if
} // end CreateBiTree

4.3 例子


二叉树可视化Java java二叉树数据结构_二叉树_03


4.4 运行视图


二叉树可视化Java java二叉树数据结构_二叉链表_04


5. Java语言下的二叉树的创建

5.1 构造根节点

/** 二叉树的数据域 */
	int data;

	/** 左孩子 */
	BinaryTree lchild;

	/** 右孩子 */
	BinaryTree rchild;

	/**
	 * 构造一个根节点
	 * 
	 * @param elem
	 */
	BinaryTree(int elem) {
		data = elem;
		lchild = null;
		rchild = null;
	}

5.2 构建二叉树

/**
	 * 二叉树的存储
	 * 
	 * @return 二叉树
	 */
	public BinaryTree createBinaryTree() {

		// 创建根节点
		BinaryTree root = new BinaryTree(1);

		// 创建树枝,值域
		BinaryTree T_l = new BinaryTree(2);
		BinaryTree T_r = new BinaryTree(3);
		BinaryTree T_l_l = new BinaryTree(4);
		BinaryTree T_r_r = new BinaryTree(5);

		// 指针域
		root.lchild = T_l;
		root.rchild = T_r;
		T_l.lchild = T_l_l;
		T_r.lchild = T_r_r;

		return root;
	} // createBinaryTree

5.3 源码

package datastructure.binarytree;

public class BinaryTree {

	/** 二叉树的数据域 */
	int data;

	/** 左孩子 */
	BinaryTree lchild;

	/** 右孩子 */
	BinaryTree rchild;

	/**
	 * 构造一个根节点
	 * 
	 * @param elem
	 */
	BinaryTree(int elem) {
		data = elem;
		lchild = null;
		rchild = null;
	}

	/**
	 * 二叉树的存储
	 * 
	 * @return 二叉树
	 */
	public BinaryTree createBinaryTree() {

		// 创建根节点
		BinaryTree root = new BinaryTree(1);

		// 创建树枝,值域
		BinaryTree T_l = new BinaryTree(2);
		BinaryTree T_r = new BinaryTree(3);
		BinaryTree T_l_l = new BinaryTree(4);
		BinaryTree T_r_r = new BinaryTree(5);

		// 指针域
		root.lchild = T_l;
		root.rchild = T_r;
		T_l.lchild = T_l_l;
		T_r.lchild = T_r_r;

		return root;
	} // createBinaryTree

} // BinaryTree