二叉树——基本概念
2016-02-21 11:02
274 查看
二叉树(Binary Tree)
1.二叉树的定义二叉树的定义是以递归形式给出的:
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。
二叉树有5种基本形态,如图1所示,任何复杂的二叉树都是这5种基本形态的复合,其中图(a)是空二叉树,图(b)是单结点的二叉树,图(c)是右子树为空的二叉树,图(d)是左子树为空的二叉树,图(e)是左右子树都不为空的二叉树。
由于二叉树区分左右子树,由n个结点组成的二叉树共有Cn2n(n+1)种。
2.二叉树的性质
性质 1 非空二叉树的第i层最多有2i−1个结点。
性质 2 高度为k的二叉树最大节点数为2k−1个。(k≥−1)
性质 3 对任何一颗二叉树,如果其叶子节点个数为n0,度为2的非叶子节点个数为n2,则有n0=n2+1。
定义 1 满二叉树(Full Binary Tree)
高度为k的满二叉树是有2k−1个结点的二叉树,因此,在满二叉树中,每一层结点都达到了最大个数。除最底层结点的度为0外,其它各层结点的度都为2。
定义 2 完全二叉树(Complete Binary Tree)
如果一棵具有n个结点的高度为k的二叉树,它的每一个结点都与高度为k的满二叉树中编号为1~n的结点一一对应,则称这棵树为完全二叉树。
性质 4 具有n个结点的完全二叉树的高度为⌈log2(n+1)⌉或⌊log2n⌋+1。
性质 5 如果将一棵有n个结点的完全二叉树自顶向下,同一层自左向右连续给节点编号为1,2,3,···,n,然后按此结点编号将树中各结点顺序地存放于一个一位数组中,并简称编号为i的结点为结点i(1≤i≤n)。则有以下关系:
若i≤⌊n/2⌋,即2i≤n,则编号为i的结点为分支结点,否则为叶子结点。
若n为奇数,则每个分支结点都既有左孩子结点,也有右孩子结点;若n为偶数,则编号最大的分支结点(编号为⌊n/2⌋)只有左孩子节点,没有右孩子结点,其余分支结点都有左右孩子结点。
若编号为i的结点有左孩子结点,则左孩子结点的编号为2i,若编号为i的结点有右孩子结点,则右孩子结点的编号为(2i+1)。
除根结点外,若一个结点的编号为i,则它的双亲结点的编号为⌊i/2⌋,也就是说,当i为偶数时,其双亲结点的编号为i/2,它是双亲结点的左孩子结点,当i为奇数时,其双亲结点的编号为(i-1)/2,它是双亲结点的右孩子结点。
3.二叉树的抽象数据类型
//对象:结点的有限集合。二叉树是有序树。 templete <class Type> class Binary { public: //构造函数,构造一棵空的二叉树 BinaryTree(); //构造函数,以item为根,lch和rch为左、右子树,构造一棵二叉树 BinaryTree(BinTreeNode<Type> *lch, BinTreeNode<Type> *rch, Type item); //判断一棵二叉树是否而空,如果二叉树为空,则函数返回1,否则返回0 int IsEmpty(); //返回父节点的地址 BinTreeNode<Type> *Parent(BinTreeNode<Type> *); //返回左孩子的地址 BinTreeNode<Type> *LeftChild(BinTreeNode<Type> *); //返回右孩子的地址 BinTreeNode<Type> *RightChild(BinTreeNode<Type> *); //插入新元素 int Insert(const Type & item); //搜索元素 int Find(const Type & item) const; //取得结点值 Type GetData() const; //取根 const BinTreeNode<Type> * GetRoot() const; };
二叉树的存储结构
1.二叉树的顺序存储结构用一组地址连续的存储单元来存放二叉树的数据元素。先将其按完全二叉树的节点标号(从1开始),其编号从小到大的顺序就是结点存放在连续存储单元的先后次序(其中#表示空结点)。
优点:已经一个结点的编号,能够方便地找到其双亲结点和孩子结点。
缺点:不适合结点的删除和插入,也就是说不适合结点的动态变化。
2.二叉树的链式存储结构
二叉树中每一个结点用链表中的一个链结点来存储。其结点结构如下:
lchild | data | rchild |
---|
struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x),left(NULL),right(NULL) {} };
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例