Tree(2)--二叉树(Binary Tree)
来源:互联网 发布:网络系统管理课程 编辑:程序博客网 时间:2024/05/16 06:19
1.二叉树的定义
二叉树(Binary Tree):一棵二叉树的结点是一个有限集合。该集合或者为空,或者是由一棵根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。二叉树的子树仍然是二叉树,达到空子树时递归的定义结束。
二叉树中不存在树大于2的结点,且左右子树的次序不能颠倒。以下是二叉树的五种不同形态:
满二叉树(Full Binary Tree)
定义:高度为h,并且由
完全二叉树(Complete Binary Tree)
定义1:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。
定义2:具有n个结点的深度为k的二叉树,它的每一个结点都与高度为k的满二叉树中编号为1-n的结点一一对应。
特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
二叉搜索树(Binary Search Tree)
定义:二叉查找树(Binary Search Tree),又被称为二叉搜索树。设x为二叉查找树中的一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。
在二叉查找树中:
2.二叉树的性质
性质1:二叉树第i层上的结点数目最多为
证明:下面用数学归纳法进行证明。
由于二叉树的每个结点至多有两个孩子,故第(i+1)层上的结点数目最多是第i层的结点数目的2倍。即第(i+1)层上的结点数目最大值=
故假设成立,原命题得证!
性质2:深度为k的二叉树至少有k个结点,至多有
证明:在具有相同深度的二叉树中,当每一层都含有最大结点数时,其树中结点数最多。利用”性质1”可知,深度为k的二叉树的结点数至多为:
故原命题得证!
性质3:包含n个结点的二叉树的高度至少为
证明:根据性质2可知,高度为h的二叉树最多有
性质4:在任意一棵二叉树中,若终端结点(叶子结点)的个数为
证明:因为二叉树中所有结点的度数均不大于2,所以结点总数(记为n)=”0度结点数(
另一方面,0度结点没有孩子,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总是:
性质5:具有n个结点的完全二叉树的深度为[
证明:因为性质2:深度为k的完全二叉树至多结点个数
因为
(此性质也适用于理想平衡二叉树)
性质6:若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。
(4) 若 2i
(5) 若 2i+1
(6) 若 i为奇数,且i不为1,它处于右兄弟位置,则它的左兄弟结点为i-1。
(7) 若 i为偶数,且i不为n,它处于左兄弟位置,则它的右兄弟结点为i+1。
(8) 结点i所在的层次为为[
3. ADT of Binary tree
template <class Type> class BinaryTree {public: BinaryTree ( ); BinaryTree ( BinTreeNode<Type> * lch, BinTreeNode<Type> * rch, Type item ); int IsEmpty ( ); BinTreeNode<Type> *Parent (BinTreeNode<Type>* c ); BinTreeNode<Type> *LeftChild (BinTreeNode<Type>* c ); BinTreeNode<Type> *RightChild (BinTreeNode<Type>* c ); int Insert ( const Type &item ); int Find ( const Type &item ) const; Type GetData ( ) const; const BinTreeNode<Type> *GetRoot ( ) const;}
4. Implementation of Binary Tree
1.二叉树的数组存储表示
这种存储方式是存储完全二叉树最简单、最省存储的方式,但是对于一般的二叉树造成空间浪费。
2.二叉树的链表存储表示
可以用二叉链表或者三叉链表来存储。一般采用三叉链表。
下图表示的是三叉链表。三叉链表的每个结点包含四个域:存放数据、指向左右孩子的指针和指向父结点的指针。整个二叉树有一个表头指针,指向根节点。
References:
[1] http://www.cnblogs.com/willwu/p/6007555.html
- Tree(2)--二叉树(Binary Tree)
- 二叉树Binary Tree
- 二叉树 Binary Tree
- Binary tree,二叉树
- 二叉树(Binary Tree)
- Binary Tree 二叉树
- 【tree 反转二叉树 inverse binary tree】
- 二叉树(binary tree)
- C++ Binary Tree(二叉树)
- Binary Tree 二叉树 160406
- 二叉树(Binary Tree)
- 数据结构-二叉树(Binary Tree)
- (轴对称二叉树)Binary Tree
- 二叉树(binary tree)
- 二叉树详解 binary tree && binary search tree
- 二叉树详解 binary tree && binary search tree
- 【算法总结】Binary Tree & Binary Search Tree 二叉树
- binary search tree 二叉搜索树
- 【面试二三事】安全岗面试谈关于SQL注入
- java&jsp最简单的注册数据库连接
- 数据库专家:MySQL分片水很深
- 软件工程课程总结
- 单点登录实现
- Tree(2)--二叉树(Binary Tree)
- 用Java怎样把String 转换为double
- CSAPP shell-lab
- Mybatis 学习 (3) 配置文件
- 设计模式之初窥门径
- mysql主从复制和并行复制
- Boolan* C++课程第九周笔记
- 主题七 最终的胜利----40.经典面试题详解
- Vuejs1.0自定义指令