广义表:(A(B(,D(E,F)),C))
按广义表表示二叉树结构生成二叉链表的算法
BinTNode CreateTree (char str)
{ //str为存储广又表的按广义表表示二叉树结构生成二叉链表的算法符串的指针
BinTNode *St [100];. //用指针数组模拟栈
BinTNode *p=NULL;
int top, k, j=0;
top=-1; //置空栈
char ch=str[j];
BinTNode *b=NULL;
while (ch!='\0') {
//循环读广义表字符串中字符
switch (ch) {
case '(': top++;St[top]=p;k=1;break;
case ')':top--; break;
case ',' :k=2;break;
default:p=(BinTNode *) malloc(sizeof (BinTNode));
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];}
return b;}
第一次循环时top值是多少
第三次循环后top变成多少
第四次循环时top值是多少,不应该是等于1吗,但St[0]-lchild被赋的值才是B,这里第四次循环是St[1]-lchild被赋的值是B,出错在哪了,
请帮忙解释每次循环代码的意义,每次循环栈的变化
算法说明:
第一次循环:读取字符'('。把 top 设为 0,把 p( NULL)推入栈中,设 k = 1。
第二次循环:读取字符'A'。创建一个新的节点 p,把它数据域设为 'A',并且把它左右子节点设为 NULL。因为这是第一个节点,所以根节点 b 设为 p。
第三次循环:读取字符'('。把top 增加到 1,把 p( 'A' 节点)推入栈中,设 k = 1。
第四次循环:读取字符'B'。创建一个新的节点 p,把它数据域设为 'B',并且把它左右子节点设为 NULL。这个时候,k = 1,所以把栈顶( 'A' 节点)的左子节点设为 p( 'B' 节点)。
第一次循环时,top 的值为 0。
第三次循环后,top 变成 1。
第四次循环时,top 的值为 1。这里没有出错,因为第四次循环时候,top = 1 表示 'A' 节点已经在栈中,所以把 'A' 节点的左子节点设为 'B' 节点。这是对的,因为 'B' 节点确实是 'A' 节点的左子节点。