问答题 假设二叉树采用二叉链存储结构存储,设计一个算法,求出根结点到给定某结点之间的路径,要求:
问答题 给出算法的基本设计思想。
【正确答案】
【答案解析】算法的基本设计思想:
由二叉树非递归后序遍历的特点我们可以知道,当遍历到某一个结点时,栈中的所有结点都是该结点的祖先,而从栈底到栈顶正是从根结点到该结点的路径,所以在非递归后序遍历算法的基础上稍做修改就可完成。
问答题 写出二叉树采用的存储结构代码。
【正确答案】
【答案解析】二叉树存储结构如下:
typedef struct BiTNode {
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
}BTNode, *BiTree;
问答题 根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
【正确答案】
【答案解析】算法的设计如下:
#define MaxSiZe 100
int AnteStoPath(BTNode *b, BTNode *s){
BTNode* st[MaxSize];
BTNode *P;
int i, flag, top=-1;
do{
while(b!=NULL){
st[++top]=b;
b=b->lChild;
}
p=NULL; //p指向当前结点的前一个已访问结点
flag=1; //设置b的访问标记为已访问
while(top!=-1 && flag){
b=st[top]; //取出栈顶元素
if(b->rchild==p){ //右子树不存在或已被访问,访问之
if(b==s){ //找到目标结点,输出路径
for(i=0; i<=top; ++i)
printf("%c", st[i]->data);
return 1;
}
else{
top--;
p=b; //p指向刚才访问的结点
}
}
else{
b=b->rchild; //b指向右子树
flag=0; //设置未被访问标记
}
}
}while(top!=-1); //栈不空时循环
return 0; //其他情况返回0
}