/**********
【题目】二叉树采用三叉链表的存储结构,试编写
不借助栈的非递归中序遍历算法。
三叉链表类型定义:
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, pr;
while(p)
{
if (p->lchild)
p = p->lchild; //寻找最左下结点
else {
visit(p->data); //找到最左下结点并访问
if (p->rchild) {
p =p->rchild; //若有右子树,转到该子树,继续寻找最左下结点
}
else {
pr = p; //否则返回其父亲
p = p->parent;
while (p && (p->lchild != pr ||!p->rchild)) { //若其不是从左子树回溯来的,或左结点的父亲并没有右孩子
if (p->lchild == pr) //若最左结点的父亲并没有右孩子
visit(p->data); //直接访问父亲(不用转到右孩子)
pr = p; //父亲已被访问,故返回上一级
p = p->parent; //该while循环沿双亲链一直查找,若无右孩子则访问,直至找到第一个有右孩子的结点为止(但不访问该结点,留给下步if语句访问)
}
if (p) { //访问父亲,并转到右孩子(经上步while处理,可以确定此时p有右孩子)
visit(p->data);
p = p->rchild;
}
}
}
}
}
二叉树采用三叉链表的存储结构,不借助栈的非递归中序遍历
最新推荐文章于 2024-08-09 13:22:09 发布