数据结构C语言实现系列7二叉树.docx

上传人:b****6 文档编号:6912083 上传时间:2023-01-12 格式:DOCX 页数:13 大小:18.10KB
下载 相关 举报
数据结构C语言实现系列7二叉树.docx_第1页
第1页 / 共13页
数据结构C语言实现系列7二叉树.docx_第2页
第2页 / 共13页
数据结构C语言实现系列7二叉树.docx_第3页
第3页 / 共13页
数据结构C语言实现系列7二叉树.docx_第4页
第4页 / 共13页
数据结构C语言实现系列7二叉树.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构C语言实现系列7二叉树.docx

《数据结构C语言实现系列7二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构C语言实现系列7二叉树.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构C语言实现系列7二叉树.docx

数据结构C语言实现系列7二叉树

数据结构C语言实现系列[7]——二叉树[1]

#include

#include

#defineSTACK_MAX_SIZE30

#defineQUEUE_MAX_SIZE30

#ifndefelemType

typedefcharelemType;

#endif

/************************************************************************/

/*                      以下是关于二叉树操作的11个简单算法               */

/************************************************************************/

structBTreeNode{

elemTypedata;

structBTreeNode*left;

structBTreeNode*right;

};

/*1.初始化二叉树*/

voidinitBTree(structBTreeNode**bt)

{

*bt=NULL;

return;

}

/*2.建立二叉树(根据a所指向的二叉树广义表字符串建立)*/

voidcreateBTree(structBTreeNode**bt,char*a)

{

structBTreeNode*p;

structBTreeNode*s[STACK_MAX_SIZE];/*定义s数组为存储根结点指针的栈使用*/

inttop=-1;/*定义top作为s栈的栈顶指针,初值为-1,表示空栈*/

intk;/*用k作为处理结点的左子树和右子树,k=1处理左子树,k=2处理右子树*/

inti=0;/*用i扫描数组a中存储的二叉树广义表字符串,初值为0*/

*bt=NULL;/*把树根指针置为空,即从空树开始建立二叉树*/

/*每循环一次处理一个字符,直到扫描到字符串结束符\0为止*/

while(a[i]!

='\0'){

     switch(a[i]){

         case'':

    break;  /*对空格不作任何处理*/

   case'(':

    if(top==STACK_MAX_SIZE-1){

        printf("栈空间太小!

\n");

     exit

(1);

    }

    top++;

    s[top]=p;

    k=1;

    break;

         case')':

    if(top==-1){

        printf("二叉树广义表字符串错误!

\n");

     exit

(1);

    }

    top--;

    break;

   case',':

    k=2;

    break;

   default:

    p=malloc(sizeof(structBTreeNode));

    p->data=a[i];

    p->left=p->right=NULL;

    if(*bt==NULL){

     *bt=p;

    }else{

        if(k==1){

            s[top]->left=p;

        }else{

            s[top]->right=p;

        }

    }

     }

  i++;  /*为扫描下一个字符修改i值*/

}

return;

}

/*3.检查二叉树是否为空,为空则返回1,否则返回0*/

intemptyBTree(structBTreeNode*bt)

{

if(bt==NULL){

     return1;

}else{

     return0;

}

}

/*4.求二叉树深度*/

intBTreeDepth(structBTreeNode*bt)

{

if(bt==NULL){

     return0;  /*对于空树,返回0结束递归*/

}else{

     intdep1=BTreeDepth(bt->left);  /*计算左子树的深度*/

  intdep2=BTreeDepth(bt->right);  /*计算右子树的深度*/

  if(dep1>dep2){

      returndep1+1;

  }else{

      returndep2+1;

  }

}

}

/*5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值*/

elemType*findBTree(structBTreeNode*bt,elemTypex)

{

if(bt==NULL){

     returnNULL;

}else{

     if(bt->data==x){

         return&(bt->data);

     }else{/*分别向左右子树递归查找*/

         elemType*p;

   if(p=findBTree(bt->left,x)){

       returnp;

   }

   if(p=findBTree(bt->right,x)){

       returnp;

   }

   returnNULL;

     }

}

}

/*6.输出二叉树(前序遍历)*/

voidprintBTree(structBTreeNode*bt)

{

/*树为空时结束递归,否则执行如下操作*/

if(bt!

=NULL){

     printf("%c",bt->data);  /*输出根结点的值*/

  if(bt->left!

=NULL||bt->right!

=NULL){

   printf("(");

   printBTree(bt->left);

   if(bt->right!

=NULL){

       printf(",");

   }

   printBTree(bt->right);

   printf(")");

  }   

}

return;

}

/*7.清除二叉树,使之变为一棵空树*/

voidclearBTree(structBTreeNode**bt)

{

if(*bt!

=NULL){

     clearBTree(&((*bt)->left));

  clearBTree(&((*bt)->right));

  free(*bt);

  *bt=NULL;

}

return;

}

/*8.前序遍历*/

voidpreOrder(structBTreeNode*bt)

{

if(bt!

=NULL){

     printf("%c",bt->data);  /*访问根结点*/

  preOrder(bt->left);    /*前序遍历左子树*/

  preOrder(bt->right);   /*前序遍历右子树*/

}

return;

}

/*9.前序遍历*/

voidinOrder(structBTreeNode*bt)

{

if(bt!

=NULL){

  inOrder(bt->left);    /*中序遍历左子树*/

     printf("%c",bt->data);  /*访问根结点*/

  inOrder(bt->right);    /*中序遍历右子树*/

}

return;

}

/*10.后序遍历*/

voidpostOrder(structBTreeNode*bt)

{

if(bt!

=NULL){

  postOrder(bt->left);   /*后序遍历左子树*/

  postOrder(bt->right);   /*后序遍历右子树*/

  printf("%c",bt->data);  /*访问根结点*/

}

return;

}

/*11.按层遍历*/

voidlevelOrder(structBTreeNode*bt)

{

structBTreeNode*p;

structBTreeNode*q[QUEUE_MAX_SIZE];

intfront=0,rear=0;

/*将树根指针进队*/

if(bt!

=NULL){

     rear=(rear+1)%QUEUE_MAX_SIZE;

  q[rear]=bt;

}

while(front!

=rear){  /*队列非空*/

     front=(front+1)%QUEUE_MAX_SIZE;/*使队首指针指向队首元素*/

  p=q[front];

  printf("%c",p->data);

  /*若结点存在左孩子,则左孩子结点指针进队*/

  if(p->left!

=NULL){

      rear=(rear+1)%QUEUE_MAX_SIZE;

   q[rear]=p->left;

  }

  /*若结点存在右孩子,则右孩子结点指针进队*/

  if(p->right!

=NULL){

      rear=(rear+1)%QUEUE_MAX_SIZE;

   q[rear]=p->right;

  }

}

return;

}

/************************************************************************/

/*

intmain(intargc,char*argv[])

{

structBTreeNode*bt;/*指向二叉树根结点的指针*/

char*b;    /*用于存入二叉树广义表的字符串*/

elemTypex,*px;

initBTree(&bt);

printf("输入二叉树广义表的字符串:

\n");

/*scanf("%s",b);*/

b="a(b(c),d(e(f,g),h(,i)))";

createBTree(&bt,b);

if(bt!

=NULL)

printf("%c",bt->data);

printf("以广义表的形式输出:

\n");

printBTree(bt);   /*以广义表的形式输出二叉树*/

printf("\n");

printf("前序:

");  /*前序遍历*/

preOrder(bt);

printf("\n");

printf("中序:

");  /*中序遍历*/

inOrder(bt);

printf("\n");

printf("后序:

");  /*后序遍历*/

postOrder(bt);

printf("\n");

printf("按层:

");  /*按层遍历*/

levelOrder(bt);

printf("\n");

/*从二叉树中查找一个元素结点*/

printf("输入一个待查找的字符:

\n");

scanf("%c",&x);  /*格式串中的空格跳过空白字符*/

px=findBTree(bt,x);

if(px){

     printf("查找成功:

%c\n",*px);

}else{

     printf("查找失败!

\n");

}

printf("二叉树的深度为:

");

printf("%d\n",BTreeDepth(bt));

clearBTree(&bt);

return0;

}

*/

数据结构C语言实现系列[7]——二叉树[2]

#include

#defineQUEUE_MAX_SIZE20

#defineSTACK_MAX_SIZE10

typedefintelemType;

#include"BT.c"

/************************************************************************/

/*                    以下是关于二叉搜索树操作的4个简单算法               */

/************************************************************************/

/*1.查找*/

/*递归算法*/

elemType*findBSTree1(structBTreeNode*bst,elemTypex)

{

    /*树为空则返回NULL*/

    if(bst==NULL){

        returnNULL;

    }else{

        if(x==bst->data){

            return&(bst->data);

        }else{

            if(xdata){    /*向左子树查找并直接返回*/

                returnfindBSTree1(bst->left,x);

            }else{        /*向右子树查找并直接返回*/

                returnfindBSTree1(bst->right,x);

            }

        }

    }

}

/*非递归算法*/

elemType*findBSTree2(structBTreeNode*bst,elemTypex)

{

    while(bst!

=NULL){

        if(x==bst->data){

            return&(bst->data);

        }elseif(xdata){

            bst=bst->left;

        }else{

            bst=bst->right;

        }

    }

    returnNULL;

}

/*2.插入*/

/*递归算法*/

voidinsertBSTree1(structBTreeNode**bst,elemTypex)

{

    /*新建一个根结点*/

    if(*bst==NULL){

        structBTreeNode*p=(structBTreeNode*)malloc(sizeof(structBTreeNode));

        p->data=x;

        p->left=p->right=NULL;

        *bst=p;

        return;

    }elseif(x<(*bst)->data){        /*向左子树完成插入运算*/

        insertBSTree1(&((*bst)->left),x);

    }else{        /*向右子树完成插入运算*/

        insertBSTree1(&((*bst)->right),x);

    }

}

/*非递归算法*/

voidinsertBSTree2(structBTreeNode**bst,elemTypex)

{

    structBTreeNode*p;

    structBTreeNode*t=*bst,*parent=NULL;

    /*为待插入的元素查找插入位置*/

    while(t!

=NULL){

        parent=t;

        if(xdata){

            t=t->left;

        }else{

            t=t->right;

        }

    }

    /*建立值为x,左右指针域为空的新结点*/

    p=(structBTreeNode*)malloc(sizeof(structBTreeNode));

    p->data=x;

    p->left=p->right=NULL;

    /*将新结点链接到指针为空的位置*/

    if(parent==NULL){

        *bst=p;        /*作为根结点插入*/

    }elseif(xdata){        /*链接到左指针域*/

       parent->left=p;

    }else{

        parent->right=p;

    }

    return;

}

/*3.建立*/

voidcreateBSTree(structBTreeNode**bst,elemTypea[],intn)

{

    inti;

    *bst=NULL;

    for(i=0;i

        insertBSTree1(bst,a[i]);

    }

    return;

}

/*4.删除值为x的结点,成功返回1,失败返回0*/

intdeleteBSTree(structBTreeNode**bst,elemTypex)

{

    structBTreeNode*temp=*bst;

    if(*bst==NULL){

        return0;

    }

    if(x<(*bst)->data){

        returndeleteBSTree(&((*bst)->left),x);        /*向左子树递归*/

    }

    if(x>(*bst)->data){

        returndeleteBSTree(&((*bst)->right),x);    /*向右子树递归*/

    }

    /*待删除的元素等于树根结点值且左子树为空,将右子树作为整个树并返回1*/

    if((*bst)->left==NULL){

        *bst=(*bst)->right;

        free(temp);

        return1;

    }

    /*待删除的元素等于树根结点值且右子树为空,将左子树作为整个树并返回1*/

    if((*bst)->right==NULL){

        *bst=(*bst)->left;

        free(temp);

        return1;

    }else{

        /*中序前驱结点为空时,把左孩子结点值赋给树根结点,然后从左子树中删除根结点*/

        if((*bst)->left->right==NULL){

            (*bst)->data=(*bst)->left->data;

            returndeleteBSTree(&((*bst)->left),(*bst)->data);

        }else{    /*定位到中序前驱结点,把该结点值赋给树根结点,然后从以中序前驱结点为根的

                   树上删除根结点*/

            structBTreeNode*p1=*bst,*p2=p1->left;

            while(p2->right!

=NULL){

                p1=p2;

                p2=p2->right;

            }

            (*bst)->data=p2->data;

            returndeleteBSTree(&(p1->right),p2->data);

        }

    }

}

/************************************************************************/

intmain(intargc,char*argv[])

{

    intx,*px;

    elemTypea[10]={30,50,20,40,25,70,54,23,80,92};

    structBTreeNode*bst=NULL;

    createBSTree(&bst,a,10);

    printf("建立的二叉搜索树的广义表形式为:

");

    printBTree(bst);

    printf("");

    printf("中序遍历:

");

    inOrder(bst);

    printf("");

    printf("输入待查找元素的值:

");

    scanf("%d",&x);

    if(px=findBSTree1(bst,x)){

        printf("查找成功!

得到的x为:

%d",*px);

    }else{

        printf("查找失败!

");

    }

    printf("输入待插入的元素值:

");

    scanf("%d",

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1