当前位置: 首页 > news >正文

二叉树的遍历和线索二叉树

二叉树遍历

二叉树结点的定义

typedef struct BiNode{Elemtype data;struct BiNode* lchild, *rchild; 
}BiNode, *BiTree; 

先序

递归算法

void PreOrder1(BiTree T){if(T!=NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);}
}

非递归算法(栈实现)

SqStack S;
void PreOrder2(BiTree T){BiNode *p=T;SqStack S;InitStack(S);while(p||!IsEmpty(S)){if(P){visit(p);Push(S, p);p=p->lchild;}else{Pop(S, p);p=p->rchild;}}return ;
}

中序

递归算法

void InOrder1(BiTree T){if(T!=NULL){PreOrder(T->lchild);visit(T);PreOrder(T->rchild);}
}

非递归算法

void InOrder2(BiTree T){BiNode *p=L;SqStack S;InitStack(S);while(p||!IsEmpty(S)){if(P){Push(S, p);p=p->lchild;}else{Pop(S, p);visit(p);p=p->rchild;}}return ;
}

后序

递归算法

void PostOrder1(BiTree T){if(T!=NULL){PreOrder(T->lchild);PreOrder(T->rchild);visit(T);}
}

非递归算法


void PostOrder2(BiTree T){BiNode *p=L;//将要进栈的结点 //需要设置一个指向上一个输出点的指针,用来实现中间结点最后输出; BiNode *pre=NULL; SqStack S;InitStack(S);while(p||!IsEmpty(S)){if(P){Push(S, p);p=p->lchild;}else{ GetTop(S, p);//取栈顶元素//若右孩子被访问过,一定是上一次访问的 if(p->rchild!=NULL&&p->rchild!=pre){p=p->rchild; }else{Pop(S, p);//出栈访问 visit(p); pre=p;//因为根据后序遍历某个点出栈,说明以这个点为根的//子树一定已经访问完了,无继续进栈结点,只能下一步从栈中找到后续进栈结点 p=NULL;}}}return ;
}

二叉树线索化

代码实质就是二叉树遍历过程!!!

结点定义

typedef struct ThreadNode{Elemtype data;struct ThreadNode* lchild, *rchild; int ltag, rtag;//线索标记 
}ThreaNode, *ThreadTree ; 

先序

递归算法

void PreThread1(ThreadTree T, ThreadNode *&pre){if(T!=NULL){//当前结点左孩子空,设置左线索,前驱节点 if(T->lchild==NULL){T->lchild=pre;T->ltag=1;//标记 }//上一个结点右孩子空,后驱结点指向当前结点 if(pre!=NULL&&pre->rchild==NULL){pre->rchild=p;pre->rtag=1;} pre=T;if(T->ltag==0){//先序是先修改,如不判断将死循环 PreThread1(T->lchild, pre);}PretThread1(T->rchild, pre);}
}

中序*

递归算法

void InThread1(ThreadTree T, ThreadNode *&pre){if(T!=NULL){InThread1(T->lchild, pre);//类似于中序visit //当前结点左孩子空,设置左线索,前驱节点 if(T->lchild==NULL){T->lchild=pre;T->ltag=1;//标记 }//上一个结点右孩子空,后驱结点指向当前结点 if(pre!=NULL&&pre->rchild==NULL){pre->rchild=p;pre->rtag=1;} pre=T;InThread1(T->rchild, pre);}
}
void CreateInThread(ThreadTree T){ThreadNode* pre=NULL;if(T!=NULL){InThread(T,pre);//想要pre指针改变,InThread1里pre设置引用 pre->rchild=NULL;pre->rtag=1;} 
}

后序

递归算法

//visit部分与中序几乎不变
void PostThread1(ThreadTree T, ThreadNode *&pre){if(T!=NULL){PostThread1(T->lchild, pre);PostThread1(T->rchild, pre);//当前结点左孩子空,设置左线索,前驱节点 if(T->lchild==NULL){T->lchild=pre;T->ltag=1;//标记 }//上一个结点右孩子空,后驱结点指向当前结点 if(pre!=NULL&&pre->rchild==NULL){pre->rchild=p;pre->rtag=1;} pre=T;}
}


http://www.mrgr.cn/news/67296.html

相关文章:

  • 高频面试题(含笔试高频算法整理)基本总结回顾33
  • LCL三相并网逆变器simulink仿真+说明文档
  • ctfshow(316)--XSS漏洞--反射性XSS
  • 每日一题之老式计算器
  • 无需手动部署的正式版comfyUI是否就此收费?开源等同免费?
  • 定时任务——xxl-job原理与实现
  • 系统思考—深层结构
  • 【客户服务】全员服务
  • 查看网路信息-ifconfig命令
  • 目前主流的人工智能学习框架有哪些?
  • Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)
  • set和map的使用
  • 大模型微调:Adapter;在大模型基础上增加低秩矩阵或者adapter有什么用,这样还增加运算
  • chromium和Blink引擎,内存的管理策略
  • 【Android】时区规则库tzdata更新
  • 【Hadoop和Hbase集群配置】3台虚拟机、jdk+hadoop+hbase下载和安装、环境配置和集群测试
  • web——[SUCTF 2019]EasySQL1——堆叠注入
  • 链表拆分与快慢指针相关算法题
  • Go语言基础语法
  • WebGUI之Gradio:Gradio 5的简介、安装和使用方法、案例应用之详细攻略