二叉树是n(n≥0)个结点的有限集合。n=0的树称为空二叉树。n>0的二叉树由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。1

概念二叉树是n(n≥0)个结点的有限集合。n=0的树称为空二叉树。n>0的二叉树由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。1

二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:1

(1)空二叉树2

(2)只有一个根结点的二叉树2

(3)只有左子树2

(4)只有右子树2

(5)完全二叉树1

二叉树的基本运算1)创建二叉树 CreatBTNode(*b,*str)1

2)查找结点 FindNode(*b,x)3

采用递归算法在二叉树b中查找值为x的结点,找到后返回其指针,否则返回NULL。2

在查找前,通常先判断二叉树是否为空,若为空,则返回查找失败。2

3)找孩子结点1

4)求树的高度3

5)输出二叉树1

通常也需判断二叉树是否为空。2

二叉树定义//二叉树节点定义struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};构造空树//清空或销毁二叉树void ClearTree(PTree *T){ T->n = NULL;}如何判断TreeEmpty(PTree *T){ /* 初始条件:树T存在。操作结果:若T为空树,则返回TRUE,否则返回FALSE */ return T->n==NULL;} 二叉树拓展(1)线索二叉树

在节点空指针域存放前驱和后继节点的指针,加上线索标志域区分是线索指针还是child指针;建立线索二叉树,实质上就是遍历一颗二叉树,在相应的指针域进行操作。2

(2)二叉排序树

(3)最优二叉树(哈夫曼树)2

对于一组有确定权值的叶子节点,构造的具有最小带权路径长度的二叉树(典型应用:哈夫曼编码)3

(3)平衡树

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。(防止退化为链表,提高搜索效率)3

(4)红黑树

红黑树是平衡二叉树的一种;它有很好的性质,树中的结点都是有序的,而且因为它本身就是平衡的,所以查找也不会出现非常恶劣的情况,基于二叉树的操作的时间复杂度是O(log(N))。Linux内核在管理vm_area_struct时就是采用了红黑树来维护内存块的。2

本词条内容贡献者为:

尚轶伦 - 副教授 - 同济大学数学科学学院