创建二叉树 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 }
复制代码

 就是酱紫~~

 

posted @ 2017-11-24 15:46  DU-fighting  阅读(1704)  评论(0编辑  收藏  举报