/**********
【题目】二叉树采用三叉链表的存储结构,试编写
不借助栈的非递归中序遍历算法。
三叉链表类型定义:
typedef struct TriTNode {
TElemType data;
struct TriTNode *parent, *lchild, *rchild;
} TriTNode, *TriTree;
**********/
void InOrder(TriTree PT, void (*visit)(TElemType))
/* 不使用栈,非递归中序遍历二叉树PT, */
/* 对每个结点的元素域data调用函数visit */
{
TriTree p = PT;
TriTree pre = NULL;
while(p != NULL){
while(p -> lchild != NULL){
p = p -> lchild;
}
//当左子树空的时候
if(p) {
visit(p -> data);
}
//遍历完本节点,左子树一定已经遍历过了,所以此时考虑是否往右走,右子树不为空的话,一定要往右边走
if(p -> rchild != NULL){
p = p->rchild;
}
else{
//如果右子树为空,且此时左子树已经遍历,便要往上走
//第二种往上走的情况是遍历完右子树
do{
pre = p;
p = p->parent;
if(p && p->lchild == pre) {
visit(p -> data);
}
}while((p->lchild == pre && p -> rchild == NULL) || p->rchild == pre);
//这里往右边走是遍历完左子树后
if(pre == p->lchild && p -> rchild != NULL){
p = p->rchild;
}
}
}
}
三叉链表中序遍历
最新推荐文章于 2024-03-05 23:19:47 发布