void inorder(node *root)
{
if (root!=NULL) //如果当前的节点为空就不用遍历
{
inorder(root->llink); // 中序遍历左子树
printf("/t%c",root->info); // 访问当前节点
inorder(root->rlink); // 中序遍历右子树
}
}
a
b c
d e f
g
一开始root="a",因为不为空,所以执行inorder(root->llink);这时自我调用,root已变成了a的左结点b了,(同时a入栈)再向下执行,再次碰到inorder(root->llink),root又变成了d(b入栈);再调用inorder(root->llink),root为NULL(d入栈)。这时碰到函数结束},开始出栈,出来第一个是d(此时的root值也恢复为d).再向下执行inorder(root->rlink),以g为root......
总之你要画好进出栈的图,就很好理解了,每次调用两个inorder函数时,root的值被改变,同时进栈,碰到整个函数的结束}时,就该从栈顶弹元素了,弹出的元素就放在root中。
{
if (root!=NULL) //如果当前的节点为空就不用遍历
{
inorder(root->llink); // 中序遍历左子树
printf("/t%c",root->info); // 访问当前节点
inorder(root->rlink); // 中序遍历右子树
}
}
a
b c
d e f
g
一开始root="a",因为不为空,所以执行inorder(root->llink);这时自我调用,root已变成了a的左结点b了,(同时a入栈)再向下执行,再次碰到inorder(root->llink),root又变成了d(b入栈);再调用inorder(root->llink),root为NULL(d入栈)。这时碰到函数结束},开始出栈,出来第一个是d(此时的root值也恢复为d).再向下执行inorder(root->rlink),以g为root......
总之你要画好进出栈的图,就很好理解了,每次调用两个inorder函数时,root的值被改变,同时进栈,碰到整个函数的结束}时,就该从栈顶弹元素了,弹出的元素就放在root中。