您的位置:首页 > 其它

二叉树——基本概念

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.二叉树的链式存储结构

  二叉树中每一个结点用链表中的一个链结点来存储。其结点结构如下:

lchilddatarchild
  对应的结点类型声明如下:

struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x),left(NULL),right(NULL) {}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树