您的位置:首页 > 其它

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

2017-09-22 18:55 393 查看
一、二叉树的基本概念

1、二叉树的定义

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

2、二叉树的特点

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

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

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

3、特殊二叉树

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





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



(3)完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐