二叉树基本数学知识,建立及三种递归遍历

来源:互联网 发布:网站源码免费分享 编辑:程序博客网 时间:2024/06/06 04:09

一.基本知识

1. 数学知识

(1)在二叉树的第i层上最多有2^(i-1)个节点

(2)深度为k的二叉树最多有2^(k)-1 个节点

(3)对任意二叉树,若叶子节点数为n0,度(节点拥有子树的个数)为2的节点数为n2,则 n0==n2+1

(4)对于具有n个节点的完全二叉树,如果按照对满二叉树节点连续编号的方式,对所有节点从1开始顺序编号,则对于任意序号为i的节点有:

  如果 i==1 ,则没有双亲节点。i>1 ,则双亲节点(是同一个节点)的序号为“i/2”  如果 2i <= n,则节点i的左孩子节点序号为 2i ,否则就没有左孩子  如果 2i + 1 <= n,则节点i的右孩子节点序号为 2i+1 ,否则就没有右孩子

以上知识可以自己画图进行验证,也可以自己进行数学论证(反正我是不会的了~_~)

二. 二叉树的创建(二叉链表)

节点定义:

typedef struct Node {    char data ;    struct Node * Lchild ;    struct Node * Rchild ;} BiNode ;

1.先序创建:

(1)第一种方法

BiNode *CreteBitree()   //返回根节点{    BiNode *p;    char ch ;    cin >> ch ;    if(ch  == '#')         return NULL;    else {        p= (BiNode *)malloc(sizeof(BiNode));        p->data = ch  ;        p->Lchild=CreteBitree();        p->Rchild=CreteBitree();    }    return p;  //p is root } 

(2)第二种方法

void CreteBitree(BiNode **root)  {    char ch ;    cin >> ch ;    if( ch == '#' )         *root= NULL;    else {        *root = (BiNode *)malloc(sizeof(BiNode));        (*root)->data = ch;        CreteBitree(&(*root)->Lchild);        CreteBitree(&(*root)->Rchild);    }}

三.二叉树的遍历

1.递归遍历

void PreOrder(BiNode *root)    //  先序遍历{    if(root)    {        cout << root->data ;        PreOrder(root->Lchild);        PreOrder(root->Rchild);    }}void InOrder(BiNode  *root) //  中序遍历{    if(root)    {        InOrder(root->Lchild);        cout << root->data ;        InOrder(root->Rchild);    }}void PostOrder(BiNode *root) // 后序遍历{    if(root)    {        PostOrder(root->Lchild);        PostOrder(root->Rchild);        cout << root->data ;    }}

完整代码:

#include<iostream>using namespace std;typedef struct Node {    char data ;    struct Node * Lchild ;    struct Node * Rchild ;} BiNode ;void CreteBitree(BiNode **root)  {    char ch ;    cin >> ch ;    if( ch == '#' )         *root= NULL;    else {        *root = (BiNode *)malloc(sizeof(BiNode));        (*root)->data = ch;        CreteBitree(&(*root)->Lchild);        CreteBitree(&(*root)->Rchild);    }}/*BiNode * CreteBitree()  {    BiNode *p;    char ch ;    cin >> ch ;    if(ch  == '#')         return NULL;    else {        p= (BiNode *)malloc(sizeof(BiNode));        p->data = ch  ;        p->Lchild=CreteBitree();        p->Rchild=CreteBitree();    }    return p; //p is root }*/void PreOrder(BiNode *root)    //  先序遍历{    if(root)    {        cout << root->data ;        PreOrder(root->Lchild);        PreOrder(root->Rchild);    }}void InOrder(BiNode  *root) //  中序遍历{    if(root)    {        InOrder(root->Lchild);        cout << root->data ;        InOrder(root->Rchild);    }}void PostOrder(BiNode *root) // 后序遍历{    if(root)    {        PostOrder(root->Lchild);        PostOrder(root->Rchild);        cout << root->data ;    }}int main(void){    BiNode *root;    cout  << "Please input the  string :" << endl ;    CreteBitree(&root);//    root = CreteBitree();    cout<< "递归!!!先序遍历:" << endl ;    PreOrder(root);    cout << endl;    cout<< "中序遍历:" << endl ;    InOrder(root);    cout << endl;    cout<< "后序遍历:" << endl ;    PostOrder(root);    cout << endl ;    return 0;}

所创建的树的形状:

这里写图片描述

运行结果:

这里写图片描述

可以看到结果是正确的!!!

备注:以上的的代码均假设输入了正确的字符,没有进行错误处理。

下一篇将诉说二叉树的非递归遍历。

原创粉丝点击