第六章树和二叉树——6.3遍历二叉树和线索二叉树
第六章树和二叉树——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;