在算法实现方面要求,熟练掌握二叉树的递归和非递归遍历,并能够用之解决实际问题,如:计算树的层数、度,查找满足条件的节点等。
1,假设二叉树采用二叉链存储结构存储,设计一个算法,求先序遍历序列中第k(1≤k≤二叉树中节点个数)个节点的值
递归模型
f(b,k)=' ' 当b=NULL时返回特殊字符' '
f(b,k)=b->data 当k=n
f(b,k)=((ch=f(b->lchild,k))==' '?f(b->rchild,k):ch) 其他情况
对应的递归算法
int n=1; //全局变量
ElemType PreNode(BTNode *b,int k)
{ ElemType ch;
if (b==NULL)
return ' ';
if (n==k)
return(b->data);
n++;
ch=PreNode(b->lchild,k); //遍历左子树
if (ch!=' ')
return(ch); //在左子树中找到后返回
ch=PreNode(b->rchild,k); //遍历右子树
return(ch); //返回右子树中的遍历结果
}
非递归算法,先序遍历对应的算法
ElemType PreNode1(BTNode *b,int k) //先序遍历的非递归算法
{ BTNode *St[MaxSize],*p;
int top=-1,n=0;
if (b!=NULL)
{ top++; //根节点进栈
St[top]=b;
while (top>-1) //栈不为空时循环
{ p=St[top]; //退栈并访问该节点
top--;
n++;
if (n==k) return(p->data);
if (p->rchild!=NULL) //右孩子节点进栈
{ top++;
St[top]=p->rchild;
}
if (p->lchild!=NULL) //左孩子节点进栈
{ top++;
St[top]=p->lchild;
}
}
printf("\n");
}
return(' ');
}
2,假设二叉树采用二叉链存储结构存储,设计一个算法,求中序遍历序列中第k(1≤k≤二叉树中节点个数)个节点的值。
递归算法
int n=1; //全局