创建二叉树 CreateBTree(*&b,*str)

创建二叉树 CreateBTree(*&b,*str)

 

最近发现 默 写 代 码 是 检 查 自 己 有 没 有 理 解 代 码 的 一 个 好 方 法,现在就把自己刚刚默写的一段代码发一下。

 

 算法设计:

1.先构造根结点N,再构造左子树L,最后构造右子树R;

2.构造右子树R时,因为担心找不到N,所以先保存N;

3.结点是按最近原则匹配,所以使用栈保存N。

 

复制代码
 1 void CreateBTree(BTNode *&b, char *str)    //注意b是指针的引用,双向传递
 2 {
 3     BTNode *p, *St[MaxSize];    //St数组作为顺序栈,注意是指针数组
 4     int k, j = 0, top = -1;    //定义栈顶top
 5     char ch;
 6     b = NULL;    //b赋值为空,初始时二叉链为空
 7     ch = str[j];
 8     while (ch != '\0')    //循环扫描str中的每一个字符
 9     {
10         switch (ch)
11         {
12         case'(':top++; St[top] = p; k = 1; break;   
/*
遇到‘(’,说明前面创建的p有孩子结点,需要将其进栈作为栈顶结点,以便建立其与孩子结点的关系。
*/
13 case ',':k = 2; break; //开始处理右孩子结点 14 case ')':top--; break; //栈顶结点的子树处理完毕,退栈。 15 default: 16 p = (BTNode *)malloc(sizeof(BTNode)); //不是“( ) ,”,这些标志而是数据的话,创建一个结点,由p指向它。 17 p->data = ch; //存放结点值 18 p->lchild = p->rchild = NULL; //左右结点设置为空 19 if (b == NULL) //根结点为空,说明还没有根结点 20 { 21 b = p; //那就把p指向的结点作为根结点 22 } 23 else //已经有了根结点 24 { 25 switch (k) 26 { 27 case 1:St[top] = p->lchild; break; //新建结点作为栈顶结点的左孩子 28 case 2:St[top] = p->rchild; break; //新建结点作为栈顶结点的右孩子 29 } 30 } 31 } 32 j++; 33 ch=str[j]; //继续扫描str 34 } 35 }
复制代码

 就是酱紫~~

 

转载于:https://www.cnblogs.com/DU-fighting/p/7890946.html

请优化一下代码:#include <stdio.h> #include <stdlio.h> #define MaxSize 100 typedef char ElemType; typedef struct node//二叉树顺序结构的类型声明 { ElemType data;//数据元素 struct node *lchild;//指向左孩子结点 struct node *rchild;//指向有孩子结点 }BTNode; void CreateBTree(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 DestoryBTree(BTNode *&b)//销毁二叉树 { if(b!=NULL) { DestoryBTree(b->lchild); DestoryBTree(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->lchild,x); } } BTNode *LchildNode(BTNode *p)//返回节点p的左孩子节点 { return p->lchild; } BTNode *RchildNode(BTNode *p)//返回节点p的右孩子节点 { return p->rchild; } int BTHeight(BTNode *b) { int lchildh,rchildh; if(b==NULL)return(0); else { lchildh=BTHeight(b->lchild); rchildh=BTHeight(b->rchild); return (lchildh>rchildh)?(lchildh+1):(rchildh+1); } } void DispBTree(BTNode *b)//输出二叉树 { if(b!=NULL) { printf("%c",b->data); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); DispBTree(b->lchild); if(b->rchild!=NULL)printf(","); DispBTree(b->rchild); printf("("); } } } void PreOrder(BTNode *b)//先序遍历 { if(b!=NULL) { printf("%c",b->data); PreOrder(b->lchild); PreOrder(b->rchild); } } void InOrder(BTNode *b)//中序遍历 { if(b!=NULL) { InOrder(b->lchild); printf("%c",b->data); InOrder(b->rchild); } }
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值