- /*
- 烟台大学计算机学院
- 文件名称:xiangmu.cpp
- 作者:刘照京
- 完成日期:2017年11月9日
- 问题描述:定义二叉树的链式存储结构,实现其基本运算,并完成测试
- 输入描述:无
- 输出描述:输出二叉树,查找后结果,左右孩子
- */
- //btree.h:
- #include <stdio.h>
- typedef char ElemType;
- typedef struct node
- {
- ElemType data;
- struct node *lchild;
- struct node *rchild;
- }BTNode;
- void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链
- BTNode *FindNode(BTNode *b,ElemType x); //返回data域为x的节点指针
- BTNode *LchildNode(BTNode *p); //返回*p节点的左孩子节点指针
- BTNode *RchildNode(BTNode *p); //返回*p节点的右孩子节点指针
- int BTNodeDepth(BTNode *b); //求二叉树b的深度
- void DispBTNode(BTNode *b); //以括号表示法输出二叉树
- void DestroyBTNode(BTNode *&b); //销毁二叉树
- //btree.cpp:
- #include <stdio.h>
- #include <malloc.h>
- #include "btree.h"
- #define MaxSize 100
- void CreateBTNode(BTNode *&b,char *str)
- {
- BTNode *St[MaxSize],*p;
- int top=-1,k,j=0;
- char ch;
- b=NULL; //建立的二叉树初始时为空
- ch=str[j];
- while(ch!='\0') //扫描字符串
- {
- switch(ch)//遇到字母。左右括号,逗号的操作
- {
- case '(':top++;
- St[top]=p;
- k=1;
- break;
- case ')':
- top--;
- break;
- case ',':
- k=2;
- break;
- default:p=(BTNode*)malloc(sizeof(BTNode));
- p->data=ch;
- p->lchild=p->rchild=NULL;
- if(b==NULL)
- {
- b=p;
- }
- else
- {
- switch(k)
- {
- case 1:
- St[top]->lchild=p;
- break;
- case 2:
- St[top]->rchild=p;
- break;
- }
- }
- }
- j++;
- ch=str[j];
- }
- }
- void DestroyBTNode(BTNode *&b)
- {
- if(b!=NULL)
- {
- DestroyBTNode(b->lchild);//销毁左子树
- DestroyBTNode(b->rchild);//销毁右子树
- free(b);//销毁根结点
- }
- }
- BTNode *FindNode(BTNode *b,ElemType x)
- {
- BTNode *p;
- if(b==NULL)
- {
- return NULL;
- }
- else if(b->data==x)
- return b;
- else
- {
- p=FindNode(b->lchild,x);//递归查找该结点
- if(p!=NULL)
- {
- return p;
- }
- else
- return FindNode(b->rchild,x);
- }
- }
- BTNode *LchildNode(BTNode *p)//求左子树
- {
- return p->lchild;
- }
- BTNode *RchildNode(BTNode *p)//求右子树
- {
- return p->rchild;
- }
- int BTNodeDepth(BTNode *b)
- {
- int lchildh;
- int rchildh;
- if(b==NULL)
- return 0;//空树
- else
- {
- lchildh=BTNodeDepth(b->lchild);//递归求根结点左子树
- rchildh=BTNodeDepth(b->rchild);//递归求根结点右子树
- {
- if(lchildh>rchildh)
- {
- return lchildh+1;
- }
- else
- {
- return rchildh+1;
- }
- }
- }
- }
- void DispBTNode(BTNode *b)//以括号表示法输出二叉树
- {
- if(b!=NULL)
- {
- printf("%c",b->data);
- if(b->lchild!=NULL || b->rchild!=NULL)
- {
- printf("(");
- DispBTNode(b->lchild);
- if(b->rchild!=NULL)
- {
- printf(",");
- DispBTNode(b->rchild);
- }
- printf(")");
- }
- }
- }
- //main:
- #include <stdio.h>
- #include "btree.h"
- int main()
- {
- BTNode *p,*lp,*rp;
- BTNode *p1;
- CreateBTNode(p,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//二叉树建立
- DispBTNode(p);
- if(FindNode(p,'H')!=NULL)
- {
- p1=FindNode(p,'H');
- if (p1!=NULL)
- {
- lp=LchildNode(p1);
- if (lp!=NULL)
- printf("\n左孩子为%c\n",lp->data);
- else
- printf("\n无左孩子\n");
- rp=RchildNode(p1);
- if (rp!=NULL)
- printf("右孩子为%c\n",rp->data);
- else
- printf("无右孩子\n");
- }
- else
- printf(" 未找到\n");
- }
- printf("%d\n",BTNodeDepth(p));
- printf("销毁树");
- DestroyBTNode(p);
- return 0;
- }
运行结果:
学习心得:学会了二叉树的链式存储结构及其基本运算。