您的位置:首页 > 其它

算法导论 练习题 10.4-5

2017-04-27 22:39 330 查看
typedef struct Tree
{
int key;
Tree *p;
Tree *left;
Tree *right;
}TN,*TNP;

void trav(TNP root)
{
TNP t =root;
while(t)
{
//向下走的过程,优先左子树
if(t->left)
{
t=t->left;
}
//同样是向下走的过程,该节点无左子树,就访问自身节点,继续找右子树
else if(t->right)
{
printf("%d ",t->key);
t=t->right;
}
else
{
//叶子节点,访问自身之后开始向上走
printf("%d ",t->key);
//一步一步向上走的过程其实也很长呀,需要迭代
while(1)
{
//这里有几种情况:
if(t==t->p->left)
{
//1、该叶子是父节点的左孩子,父节点有右子树,那么访问完父节点,接下来应该访问父节点的右子树。
//这时需要跳出向上走的迭代过程,开始沿着右子树向下走
if(t->p->right)
{
printf("%d ",t->p->key);
t=t->p->right;
break;
}
//2、该叶子是父节点的左孩子,父节点没有右子树,那么访问完父节点,继续向上走
else
{
printf("%d ",t->p->key);
t=t->p;
}
}
//该节点是父节点的右孩子,因为右子树是访问完左子树和根之后访问的,所以不需要访问父节点,直接向上走
else
{
t=t->p;
}
//如果向上走到根节点,结束
if(t==root)
return;
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: