文章目录

  • 一、建立一个排序二叉树
  • 二、四种遍历

前言

这里先给出建立一颗普通的排序二叉树,平衡二叉树的建立以及操作,等复习到再写吧。

一、排序二叉树

排序二叉树,即当前节点左子树 < 当前节点 < 当前节点的右子树 的特殊的二叉树,便于查找。

排序二叉树的构造很简单,使用三个树节点指针。currentNode(指向当前遍历节点地址的指针)  parentNode(保存当前遍历节点的父节点地址的指针) ,和一个新节点指针newNode

每插入一个新节点,移动这三个指针,即在树上找到合适的位置插入新节点

代码如下:

currentNode = root;while(currentNode!=NULL){parentNode = currentNode; //当cur 是空的时候 结束循环 此时par 就是 cur的父节点if(currentNode->date > newNode->date){currentNode = currentNode->lchild;}else{currentNode = currentNode->rchild;}}if(parentNode->date > newNode->date)  //找到位置了,新节点要插在这个par下面parentNode->lchild = newNode;  //再判断一下elseparentNode->rchild = newNode;

二、四种遍历

模板一样的东西,记下来就行了。挺简单的。

void PreOrder(BiTree root)
{if(root!=NULL){cout<<root->date<<" ";PreOrder(root->lchild);PreOrder(root->rchild);}
}void InOrder(BiTree root)
{if(root!=NULL){InOrder(root->lchild);cout<<root->date<<" ";InOrder(root->rchild);}
}
void PostOrder(BiTree root)
{if(root!=NULL){PostOrder(root->lchild);PostOrder(root->rchild);cout<<root->date<<" ";}
}
void LevelOrder(BiTree root)
{if(root==NULL){cout<<"当前树为空"<<endl;}q.push(root);BiTNode *cur=NULL;while(!q.empty()) {cur= q.front(); //遍历当前节点 q.pop();cout<<cur->date<<" ";if(cur->lchild) q.push(cur->lchild); //左孩子有孩子入队列 if(cur->rchild) q.push(cur->rchild); }
}

一个完整的实例

树结构如下:

先序遍历结果:5 4 2 1 3 8 7 6 9

中序遍历结果:1 2 3 4 5 6 7 8 9

后序遍历结果:1 3 2 4 6 7 9 8 5

层次遍历结果:5 4 8 2 7 9 1 3 6

#include<iostream>
#include<queue>
using namespace std;
//排序二叉树 typedef int ElemType;
typedef struct BiTNode{ElemType date;struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
queue<BiTNode*> q; //层次遍历用 BiTree add(BiTree root,int e)
{BiTNode *newNode=NULL;  //新结点指针 BiTNode *currentNode=NULL;  //当前遍历到的节点指针 BiTNode *parentNode=NULL;  //父节点指针 newNode = (BiTNode*)malloc(sizeof(BiTNode));newNode->date=e;newNode->lchild=NULL;newNode->rchild=NULL;if(root==NULL) //第一个节点建立 {return newNode;}else  //往下找 {currentNode = root;while(currentNode!=NULL){parentNode = currentNode;if(currentNode->date > newNode->date){currentNode = currentNode->lchild;}else{currentNode = currentNode->rchild;}}if(parentNode->date > newNode->date)parentNode->lchild = newNode;elseparentNode->rchild = newNode;} return root;
}BiTree CreateBtree(int e[],int len)
{BiTree root = NULL;    //根节点指针初始为空 for(int i=1;i<=len;i++){root = add(root,e[i]);}return root;
} void PreOrder(BiTree root)
{if(root!=NULL){cout<<root->date<<" ";PreOrder(root->lchild);PreOrder(root->rchild);}
}void InOrder(BiTree root)
{if(root!=NULL){InOrder(root->lchild);cout<<root->date<<" ";InOrder(root->rchild);}
}
void PostOrder(BiTree root)
{if(root!=NULL){PostOrder(root->lchild);PostOrder(root->rchild);cout<<root->date<<" ";}
}
void LevelOrder(BiTree root)
{if(root==NULL){cout<<"当前树为空"<<endl;}q.push(root);BiTNode *cur=NULL;while(!q.empty()) {cur= q.front(); //遍历当前节点 q.pop();cout<<cur->date<<" ";if(cur->lchild) q.push(cur->lchild); //左孩子有孩子入队列 if(cur->rchild) q.push(cur->rchild); }
}int main()
{int len;BiTree root = NULL;cin>>len;int e[len+1];  for(int i=1;i<=len;i++){cin>>e[i];}root=CreateBtree(e,len);cout<<"先序结果:";PreOrder(root);cout<<endl;cout<<"中序结果:"; InOrder(root);cout<<endl;cout<<"后序结果:";PostOrder(root);cout<<endl;cout<<"层次结果:";     LevelOrder(root);return 0;
}

<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=1362193347&auto=0&height=66"></iframe>

【树的四种遍历方法(遍历排序二叉树)】相关推荐

  1. 按照前序遍历创建二叉树及树的四种遍历方式

    一.二叉树的介绍 二叉树的特点是二叉树的每个结点的度都不大于2,可以视为每个结点都有左孩子和右孩子.故二叉树结点的数据结构为 二.二叉树的特点 1.设根结点所在的层数为第1层,则第i层最多有个结点. ...

  2. java如何遍历树_java 遍历树的四种方式

    java 遍历树的四种方式 最近做一个玫瑰图报表,数据源为TreeJson(树状json),在网上搜集下资料,和大家分享.: 先序遍历 中序遍历 后序遍历 层次遍历 public class Tree ...

  3. php xml对象解析_php解析xml 的四种简单方法(附实例)

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...

  4. 静态路由的四种配置方法

    静态路由的四种配置方法: 1.配置出接口和下一跳 双击路由器AR1进入配置界面 输入 system-view进入系统视图(也可以只打出sys,然后用Tab键进行补全命令,) 首先在ensp中搭建如图所 ...

  5. ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)

    总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选 ...

  6. 大数据可视化python_大数据分析之Python数据可视化的四种简易方法

    本篇文章探讨了大数据分析之Python数据可视化的四种简易方法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 数据可视化是任何数据科学或机器学习项目的一个重要组成部分 ...

  7. 计算机提示无法识别优盘,win7电脑无法识别u盘的四种解决方法

    很多朋友把U盘插win7电脑拷贝资料文件的时候发现没响应,提示无法识别,重新拔插了之后也无法读取.检查确定自己U盘没有问题,那么很可能是系统设置出现问题,这该怎么解决?针对此疑问,小编和大家说下win ...

  8. 如何用计算机做样本抽样,抽样的四种基本方法

    1.单纯随机抽样 单纯随机抽样是在总体中以完全随机的方法抽取一部分观察单位组成样本(即每个观察单位有同等的概率被选入样本).常用的办法是先对总体中全部观察单位编号,然后用抽签.随机数字表或计算机产生随 ...

  9. python 财务分析可视化方法_Python数据可视化的四种简易方法

    Python数据可视化的四种简易方法 作者:PHPYuan 时间:2018-11-28 03:40:43 摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视 ...

  10. java的四种输入方法,你会几种?

    java的输入方法最常见的就是Scanner的方法,我经过查阅一些资料发现了输入方法原来还有那么多种,可以玩出不少花样,下面是我总结出的四种输入方式,有需要的可以拿去 1.Scanner相关的功能 S ...

最新文章

  1. linux系统内存执行elf的多种方式
  2. dwz中弹出的窗口页面如何获取前页面(点击按钮的页面)的元素???
  3. mysql2012用户名_SQL Server 登录名、服务器角色、用户名和数据库角色 --- 解释
  4. 清北学堂模拟day4 捡金币
  5. hdu 1698 Just a Hook 基本线段树
  6. opencv+python 霍夫圆检测原理
  7. 浏览器同步测试神器 — BrowserSync
  8. 软件测试思维导图大全
  9. 世界头号黑客“米特尼克”对生活的见解自述
  10. 2022年全球市场巧克力行业发展前景分析及市场需求调研报告
  11. 2021.12.21报错解决:jquery.min.js:5 POST http://localhost:3000/login 400 (Bad Request)
  12. 中学生计算机编程大赛有哪些,学了编程可以参加哪些含金量高的比赛?
  13. 马云:全面进军芯片领域!打响第一炮!中国科技当自强!!
  14. 国内BLDC电机控制方案目前存在什么痛点?
  15. 钢铁集团的混合云灾备
  16. ACL 2020 | 特定风格标题生成《Hooks in the headline》论文阅读笔记
  17. access身份证号掩码_ACCESS掩码表
  18. Unity可自定义loading页的异步加载工具,免费下载,使用说明
  19. 关于STM32的CANFD IP设计的缺陷
  20. 微电影广告具有哪些特点?

热门文章

  1. CSS--移动端布局
  2. 邯郸职业技术学院计算机宿舍,邯郸职业技术学院宿舍条件怎么样
  3. 三角函数补充(反三角函数与 sec)
  4. Sublime text3 Version 3.22下载安装及注册
  5. 语音交友app开发权限系统,全面的设计方案
  6. c枚举类型enum例题_c枚举类型enum用法 枚举类型enum用法 怎么去取所有
  7. LCD接口和RGB介绍
  8. 初代AirPods Pro迎来自适应通透模式,唯独缺少充电盒Find My功能
  9. Java调用JS,JS调用JAVA
  10. 17K薪资要什么水平?来看看95后测试工程师的面试全过程…