第六章树和二叉树——6.3遍历二叉树和线索二叉树
对于二叉树中的信息,我们如果需要遍历一遍有三种方法。
先序,中序,后序。
例6.1 用先序遍历二叉树
Status preordertraverse(bitree t, Status(*visit)(telemtype e))
{
if (t)
{
if (visit(t->data))
if (preordertraverse(t->lchild, visit))
if (preordertraverse(t->rchild, visit)) return ok;
return error;
}
else
return ok;
}
例6.2中序二叉树非遍历算法1
Status inordertraverse(bitree t, Status(*visit)(telemtype e))
{
initstack(s);
push(s, t);
while (!stackempty)
{
while (gettop(s, p) && p) push(s, p->lchild);
pop(s, p);
if (!stackempty(s))
{
pop(s, p);
if (!visit(p->data))
return error;
push(s, p->rchild);
}
}
}
例6,.3中序二叉树非遍历算法2
Status inordertraverse(bitree t, Status(*visit)(telemtype e))
{
initstack(s);
p = t;
while (p || !stackempty(s))
{
if (p)
{
push(s, p);
p = p->child;
}
else
{
pop(s, p);
if (!visit(p->data))
return error;
p = p->rchild;
}
}
return ok;
}
例6.4按先序顺序输入字符
Status creatbitree(bitree& t)
{
scanf(&ch);
if (ch == ' ') t = NULL;
else
{
if (!(t = (bitnode*)malloc(sizeof(bitnode))))exit(overflow);
t->data = ch;
creatbitree(t->lchild);
creatbitree(t->rchild);
}
return ok;
}
二叉树的二叉线索表示
typedef enum pointertag{link,thread};
typedef struct birthnode
{
telemtype data;
struct birthnode* lchild, * rchild;
pointertag ltag, rtag;
}birthnode,*bithrtree;
例6.5 中序遍历二叉线索树非递归算法
Status inordertraverse(bitree t, Status(*visit)(telemtype e))
{
p = t->lchild;
while (p != t)
{
while (p->ltag == link) p = p->lchild;
if (!visit(p->data)) return error;
while (p->rtag == thread && p->rchild != t)
{
p = p->rchild;
visit(p->data);
}
p = p->rchild;
}
return ok;
}
例6.6中序遍历二叉树,将其线索化,没看懂等看懂在写
// An highlighted block
var foo = 'bar';