树的实现和二叉树的定义

来源:互联网 发布:米雪儿sherry淘宝 编辑:程序博客网 时间:2024/05/17 03:10

为了实现树,树中的每一个节点除数据外还要有一些指针,使得该节点的每一个孩子节点都有一个指针指向它。实际中由于树中某个节点的孩子节点数可以变化很大且事先不知道,故在树的数据结构中建立到各孩子节点直接的链接是不可行的(假如这样做会产生太多的浪费空间)。

  实际上比较简单的做法:将树中每个节点的所有孩子节点都放在树节点的链表中。具体声明如下:

typedef struct TreeNode *PtrToNode;struct TreeNode{    ElementType Element;    PtrToNode FirstChild;    PtrToNode NextSibling;}

下图的树结构中,向下的箭头是指向某个节点的FirstChild(第一孩子)的指针,从左到右的箭头是指向该节点的NextSibling(下一兄弟)的指针。因为空指针太多,故没有把它们画出来。

这里写图片描述

在上图中,节点C有一个指针(NextSibling)指向兄弟节点E,另一个指针(FirstChild)指向孩子节点D;有些节点(如D、H、K和M等)这两种指针均没有。

树有很多应用,比较广泛流行的用法是包括UNIX、VAX/VMS和DOS等常用操作系统中的目录结构

二叉树(binary tree)是一棵树,其中每个节点都不能有多于2个的孩子(子树),且二叉树节点的孩子(子树)有左右之分,次序不能颠倒。由此定义可知在二叉树中不存在度【某个节点拥有的孩子(子树)的数目】大于2的节点。

这里写图片描述

二叉树的平均深度要比N(树的总节点数)小很多,这个平均深度为O(sqrt(N)),最大深度可以大到(N-1)。

通常采用链式存储二叉链表和顺序存储数组这2种方法来存储二叉树,其中二叉链表法因为灵活、方便操作的特点而被经常使用。二叉树的二叉链表存储结构如下代码和图所示:

typedef struct BinaryTreeNode *PtrToNode;typedef struct PtrToNode Tree;struct BinaryTreeNode{    ElementType Element;    Tree        Left;    Tree        Right;};______________________________typedef struct BinaryTreeNode{    ElementType Element;    struct BinaryTreeNode *Left;    struct BinaryTreeNode *Right;}BinaryTreeNode,*BinaryTree;                二叉树节点声明

对应举例说明二叉树的二叉链表存储过程

这里写图片描述

二叉树的性质:
(1)在二叉树中的第i层上至多有2^(i-1)个节点(i≥1);
(2)层数(有说深度的)为k的二叉树至多有2^k-1个节点(k≥1);
(3)对任何一棵二叉树T,如果其终端节点(度为0)的数目为n0,度为2的节点数目为n2,则n0=n2+1

满二叉树:层数为k且具有2^k-1个节点的二叉树,即满二叉树中的每一层上的节点数都是最大的节点数,所有终端都在同一个层次,且非终端节点的度都为2;
完全二叉树:层数为k且具有n个节点的二叉树,当且仅当每一个节点与层数为k的满二叉树中的编号从1至n的节点一一对应;对于完全二叉树,设某个节点的编号为i,则其父节点的编号为floor(i/2),2*i为它的左子节点,(2*i+1)为它的右子节点。

结论:满二叉树和完全二叉树是2种特殊形态的二叉树,满二叉树肯定是完全二叉树,但完全二叉树不一定是满二叉树。

这里写图片描述

(4)具有n个节点的完全二叉树的层数(最大层次)为floor(log2(n))+1 。【floor()函数向下取整】

二叉搜索(查找)树(binary search tree),也称有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),它是指一棵空树或者具有下列性质的二叉树:

(1)若任意节点的左子树不空,则它的左子树上所有节点的元素值均小于该节点的元素值;
(2)若任意节点的右子树不空,则它的右子树上所有节点的元素值均大于该节点的元素值;
(3)任意节点的左、右子树也分别为二叉搜索树;
(4)没有键值相等的某2个节点。

这里写图片描述

二叉搜索树的优势在于查找、插入的时间复杂度较低,为O(log(n))【n为树的总节点数】;二叉查找树可以用来构建诸如集合、multiset和关联数组等。

参考资料

1.《算法导论》读书笔记之第10章 基本数据结构之二叉树

2.浅谈算法和数据结构(7)

3.轻松搞定面试中的二叉树题目

4.二叉搜索树-维基百科

5.数据结构与算法分析-C语言描述【书籍】

0 0