数据结结构学习 -- 2叉树
------ 二叉树的顺序存储表示 ------
#define MAX_TREE_SIZE 100;
typedef TElemType SqBiTree[MAX_TREE_SIZE];
SqBiTree bt;
------ 二叉树的 二叉链表存储表示 ------
typedef struct BiTNode {
TElemType data;
struct BiTNode * lchild, *rchild;
}BiTNode,BiTree;
遍历2叉树 L,D,R (左子树,根,右子树) 先根遍历,中根遍历,后根遍历。
status PreOderTraverse(BiTree t, status (* visit)(TElemType e)) {
if (t) {
visit (t->data)
if (PreOderTraverse(t->lchild,visit) )
if (PreOderTraverse(t->rchild,visit)) return ok;
return ERROR;
}else return ok;
}
中序遍历二叉树非递归方法
status InOrderTraverse(BiTree t, status (*visit)(TElemType e) ) {
InitStack(s) ; push( s,T); // 根进栈
while( !StatckEmpty(s)) {
while ( GetTop(s,p) && p ) push(s,p->lchild); //向左走到尽头
pop(s,p); //空指针退栈
if(!StackEmpty(s)) {
pos(s,p); if(!visit(p->data)) return ERROR;
push(s,p->rchild);
} // if
} //while
return ok;
}
status InOrderTraverse(BiTree t, status (*visit)(TElemType e) ) {
InitStack(s); p=T;
while(p || !StackEmpty(s,p) ) {
if(p) push(s,p->lchild); //根指针近栈,遍历左子树
else {
pop(s,p); if(!visit(p->data)) return ERROR;
p = p->rchild;
} //else
} //while
return OK;
}
status CreateBiTree( BiTree & t) {
scanf(&ch);
if ( ch == '') t= NULL;
else {
if(!(t= (BiTNode*) malloc (sizeof(BiTNode) ) ) ) exit;
t->data = ch;
CreateBiTree(t->lchild);
CreateBiTree(t->rchild);
}//else
}
------ 二叉树的 二叉线索存储表示 ------
typedef enum PointerTag { Link , Thread } ;
typedef struct BiThrNode {
TElemType data;
struct BiThrNode * lchild ,rchild;
PointerTag LTag,RTag;
} BiThrNode,*BiThrTree;
status InOrderTraverse_Thr(BiThrTree t, status (*visit)(TElemType e) ) {
p = T->lchild; //p 指向根节点
while(p!=t) { //空树或遍历结束时,P==t
while(p->LTag = Link) p = p->lchild; //
if (!viist (p->data) return ERROR;
while( (p->RTag == Thread) && p->rchild!=t) {
p = p->rchild; visit(p->data);
}//while
p = p->rchild;
}//while
return OK;
}
中序遍历二叉树并线索化链表
status InOrderThreading(BiThrTree & thr,BiThrTree t) {
if (! ( thrt= (BiThrTree) malloc ( sizeof(BiThrTree) ) ) ) exit;
thrt->LTag = link; thrt->RTag = thread; //建立头结点
thrt->rchild = thrt; //右指针回指
if (!t) thrt->lchild = thrt; //若二叉树为空,则左指针回指
else {
thrt->lchild = t ; pre= thrt;
InThreading(t); //中序遍历进行中序线索化
pre->rchild = thrt; pre->RTag = Thread; //最后一个节点线索化
thrt->rchild = pre;
} //else
return ok;
}
void InThreading(BiThrTree p) {
if (p) {
InThreading(p->lchild); //左子树线索化
if(!p->lchild) { p->LTag = Thread; p->lchild = pre; } //前驱线索
if(!pre->rchild) { pre->RTag = Thread; pre->rchild = p; } // 后续线索
pre = p;
InThreading(p->rchild);
} //if
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」