当前位置: 首页 > 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.lryc.cn/news/478377.html

相关文章:

  • SpringBoot3 集成Junit4
  • Scala的set的添加删减和查询
  • 基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)
  • 【spark面试题】RDD和DataFrame以及DataSet有什么异同
  • [Python]关于Tensorflow+Keras+h5py+numpy一些骚操作备忘
  • 深度学习:Transformer 详解
  • jmeter 性能测试步骤是什么?
  • 前端入门一之JS最基础、最基础语法
  • 解决Swp交换空间被占满问题
  • 草地景观中的土地覆被变化:将增强型大地遥感卫星数据组成、LandTrendr 和谷歌地球引擎中的机器学习分类与 MLP-ANN 场景预测相结合
  • 【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
  • 《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)
  • 深入解析gdb -p 与gdb attach 的区别与使用场景
  • C语言 | Leetcode C语言题解之第542题01矩阵
  • 论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution
  • 前端介绍|基础入门-html+css+js
  • [WSL][桌面][X11]WSL2 Ubuntu22.04 安装Ubuntu桌面并且实现GUI转发(Gnome)
  • PMC如何根据实际情况调整生产作业计划?
  • unity中 骨骼、纹理和材质关系
  • 18、论文阅读:AOD-Net:一体化除雾网络
  • Hadoop生态圈框架部署(五)- Zookeeper完全分布式部署
  • 【机器学习】聚类算法分类与探讨
  • MySQL中distinct与group by之间的性能进行比较
  • 计算机视觉读书系列(1)——基本知识与深度学习基础
  • 怎么查看navicat的数据库密码
  • webrtc前端播放器完整案例
  • GORM优化器和索引提示
  • linux驱动-i2c子系统框架学习(1)
  • 元戎启行嵌入式面试题及参考答案
  • 【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽