二叉树的基本概念、存储结构、和创建方法

来源:互联网 发布:网络电影情迷冯家屯 编辑:程序博客网 时间:2024/06/11 09:43

一、二叉树的基本概念

1、二叉树的定义

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

2、二叉树的特点

(1)每个二叉树最多有两棵子树,所以二叉树中不存在度大于2的结点。

(2)左子树和右子树是有顺序的,次序不能任意颠倒。

(3)即使树中某结点只有一颗子树,也要区分它是左子树还是右子树。

3、特殊二叉树

(1)斜树:所有的结点都只有左子树的二叉树叫左斜树。所有的结点都只有右子树的二叉树叫右斜树。这两者统称为斜树。


(2)满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。


(3)完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。


4、二叉树的性质

(1)在二叉树的第i层上至多有2i-1个结点(i>=1)。

(2)深度为k的二叉树至多有2k-1个结点(i>=1)。

(3)为任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

(4)具有n个结点的完全二叉树的深度为└log2n┘+1(└x┘)表示不大于x的最大整数。

(5)如果一棵有n个结点的完全二叉树(其深度为└log2n┘+1)的结点按层序编号(从第1层到第└log2n┘+1层,每层从左到右),对任一结点i(1<=i<=n)有:

①如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点└i/2┘。

②如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子结点是结点2i。

③如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。

二、二叉树的链式存储结构

1、二叉树的结点结构定义:

typedef struct BtNode { ElemType data;struct BtNode *leftChild;struct BtNode *rightChild;}BtNode,*BinaryTree;

三、二叉树的创建方法

1、通过前序序列创建二叉树

BtNode * CreateTree1()//通过前序遍历序列+#号构建二叉树{BtNode *s = NULL;ElemType item = 0;scanf("%c",&item);if (item != END){s = BuyNode();s->data = item;s->leftChild = CreateTree1();s->rightChild = CreateTree1();}return s;}BtNode * CreateTree2(ElemType *&str)//指针的引用{BtNode *s = NULL;if (str != NULL && *str != END){s = BuyNode();s->data = *str;s->leftChild = CreateTree2(++str);s->rightChild = CreateTree2(++str);}return s;}BtNode * CreateTree3(ElemType * * const pstr){BtNode *s = NULL;if (pstr != NULL && *pstr != NULL && **pstr != END){s = BuyNode();s->data = **pstr;s->leftChild = CreateTree3(&++*pstr);s->rightChild = CreateTree3(&++*pstr);}return s;}

2、通过先序和中序序列创建二叉树

递归方法:

int IsIndex(ElemType *is,ElemType x,int n){for (int i = 0;i<n;++i){if (is[i] == x){return i;}}return -1;}BtNode * CreatePI(ElemType *ps,ElemType *is,int n){BtNode *s = NULL;if (n > 0){s = BuyNode();s->data = ps[0];int pos = IsIndex(is,ps[0],n);//////////////if (pos == -1){exit(1);}s->leftChild = CreatePI(ps+1,is,pos);s->rightChild = CreatePI(ps+pos+1,is+pos+1,n-pos-1);}return s;}BtNode * CreateTreePI(ElemType *ps,ElemType *is,int n){    if (ps == NULL || is == NULL || n < 1)    {        return NULL;    }    else    {        return  CreatePI(ps,is,n);    }}
3、通过后序和中序序列创建二叉树

递归方法:

int IsIndex(ElemType *is,ElemType x,int n){for (int i = 0;i<n;++i){if (is[i] == x){return i;}}return -1;}BtNode * CreateIL(ElemType *is,ElemType *ls,int n){    BtNode *s = NULL;    if (n > 0)    {        int pos = IsIndex(is,ls[n-1],n);        if (pos == -1)        {            exit(1);        }        s = BuyNode();        s->data = ls[n-1];        s->leftChild = CreateIL(is,ls,pos);        s->rightChild = CreateIL(is+pos+1,ls+pos,n-pos-1);    }    return s;}BtNode * CreateTreeIL(ElemType *is,ElemType *ls,int n){    if (is == NULL || ls == NULL || n < 1)    {        return NULL;    }    else    {        return CreateIL(is,ls,n);    }}
原创粉丝点击