文章目录
- 二叉树
- 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. 树的表示方法
3. 什么是二叉树
- 每个节点至多只有两课子树(不存在度大于2的节点)。
- 二叉树的子树有左右之分,其次序不能任意颠倒。
3.1 二叉树的分类
3.2 二叉树的性质
- 在二叉树的第 i 层至多有 2 的 i-1 次方个节点(i>=1)
- 深度为 k 的二叉树至多有 2 的 k 次方减 1 个节点
- n0 = n2 + 1
求证: n0 = n2 + 1
证明:
n = n0 + n1 + n2
设 B 为二叉树的分支树
n = B + 1
B = n1 + 2n2
所以:n = n1 + 2n2 + 1
得:n0 = n2 + 1
- 满二叉树:每一层节点数都达到最大,不存在只有左节点。(一颗深度为 k 且有 2 的 k 次方减 1 个节点的二叉树)。
- 完全二叉树:有右节点,则必有左节点。(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。)
- 分支数 = 节点数 - 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 例子
4.4 运行视图
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