二叉树BinTree4种遍历及其应用
前序遍历
template<class T> void BinTree<T>::PreOrder(BinTreeNode<T>*subTree){ //前序遍历以subTree为根的树 if(subTree!=NULL){ cout<<subTree->data<<endl; PreOrder(subTree->leftChild); PreOrder(subTree->rightChild); } }
中序遍历
template<class T> void BinTree<T>::InOrder(BinTreeNode<T>*subTree){ //中序遍历以subTree为根的树 if(subTree!=NULL){//NULL是递归终止条件 InOrder(subTree->leftChild);//中序遍历左子树 cout<<subTree->data<<endl;//访问根结点 InOrder(subTree->rightChild);//中序遍历右子树 } }
后序遍历
template<class T> void BinTree<T>::PostOrder(BinTreeNode<T>*subTree){ //后序遍历以subtree为根的树 if(subTree!=NULL){ PostOrder(subTree->leftChild); PostOrder(subTree->rightChild); cout<<subTree->data<<endl; } }
已知中序排列,和先序排列,可以还原二叉树,并推出后序排列。
已知中序排列,和后序排列,可以还原二叉树,并推出先序排列。
但是已知先序排列和后序排列,可能无法唯一确定二叉树。
层次序遍历,需要用到队列
template<class T> void BinTree<T>::LevelOrder(BinTreeNode<T>*subTree) { //层次序遍历以subTree为根的二叉树 Queue<BinTreeNode<T>*>Q;//定义队列 BinTreeNode<T>*p=subTree; Q.EnQueue(p);//根结点入队 while(!Q.IsEmpty()){//队列不空 Q.DeQueue(p); cout<<p->data; if(p->leftChild!=NULL) Q.EnQueue(p->leftChild);//左子入队 if(p->rightChild!=NULL) Q.EnQueue(p->rightChild);//右子入队 } }
遍历看完后,接下来是遍历的应用以及遍历思想的应用
前序遍历的应用——复制构造函数与复制函数
template<class T> BinTree<T>::BinTree(const BinTree<T>&s){ //复制构造函数 root=Copy(s.root); } template<class T> BinTreeNode<T>* BinTree<T>::Copy(BinTreeNode<T>*orignode){ //返回一个指针,它给出一个以orignode为根的二叉树的副本 if(orignode==NULL) return NULL; BinTreeNode<T>*temp=new BinTreeNode<T>;//创建根结点 temp->data=orignode->data; temp->leftChild=Copy(orignode->leftChild); temp->rightChild=Copy(orignode->rightChild); return temp; }
前序遍历的应用——判断两颗二叉树是否相等
template<class T> bool equal(BinTreeNode<T>*a,BinTreeNode<T>*b){ //为BinTree类的友元函数 if(a==NULL&&b==NULL) return true; if(a!=NULL&&b!=NULL&&a->data==b->data&&equal(a->leftChild,b->leftChild)&&equal(a->rightChild,b->rightChild)) return true; else return false; }
前序遍历的应用——利用前序遍历建立二叉树
约定以输入序列中不可能出现的值作为空结点的值以结束递归,此值在RefValue中,如# template<class T> void BinTree<T>::CreatBinTree(ifstream& in,BinTreeNode<T>*&subTree){ //以递归的方式建立二叉树 T item; if(!in.eof()){//未读完,读入并建树 in>>item; if(item!=RefValue){ subTree->data=item; CreatBinTree(in,subTree->leftChild);//递归建立左子树 CreatBinTree(in,subTree->rightChild);//递归建立右子树 } else subTree=NULL; } }
后序遍历的应用——计算结点的个数
template<class T> int BinTree<T>::Size(BinTreeNode<T>*subTree) const{ //计算以subTree为根的二叉树的结点的个数 ;//递归结束 +Size(subTree->leftChild)+Size(subTree->rightChild); }
后序遍历的应用——计算树的高度
template<class T> int BinTree<T>::Height(BinTreeNode<T>*subTree) const{ //计算以subTree为根的二叉树的高度 ; +max(Height(subTree->leftChild),Height(subTree->rightChild)); }
二叉树BinTree4种遍历及其应用的更多相关文章
- HDU 1710 二叉树三种遍历
Binary Tree Traversals Problem Description A binary tree is a finite set of vertices that is either ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- Python实现二叉树的四种遍历
对于一个没学过数据结构这门课程的编程菜鸟来说,自己能理解数据结构中的相关概念,但是自己动手通过Python,C++来实现它们却总感觉有些吃力.递归,指针,类这些知识点感觉自己应用的不够灵活,这是自己以 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...
- UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)
题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...
- 基于Java的二叉树的三种遍历方式的递归与非递归实现
二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...
- PTA 二叉树的三种遍历(先序、中序和后序)
6-5 二叉树的三种遍历(先序.中序和后序) (6 分) 本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTr ...
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
随机推荐
- stylus快速上手
定义变量,比如一键切换主题色 1.创建xxx.styl文件,定义变量 $bgColor = #00bcg4 2.在其他页面的style区域里,先引入这个xxx.styl文件 <style> ...
- go中基本数据类型的相互转换
代码 // 基本数据类型的相互转换 package main import ( // 如果一个包没有被使用过,但又不想去掉,可在包名前加"_ "表示忽略 // 比如:_ " ...
- Vue/React如何优雅的一劳永逸的注册路由及组件
原文链接: 本人掘金文章 假如图片看不清晰可前往掘金原文预览 官方文档: 组建注册 路由注册 未优化版: 在Vue官方文档 中,我们通过 Vue.component('MyComponentNam ...
- c#中decimal的去0显示
在近来的开发中,遇到到了decimal中显示0的问题,搞了很久才搞好了,现在就简单介绍一下其中一小部分,其他的网上很上很多 public static string DecimalToString(d ...
- xftp xshell 个人下载官网
https://www.netsarang.com/zh/xftp-download/
- 常见3种Git服务器的构建
学习Git不同的服务器形式,具体如下: - 创建SSH协议服务器 - 创建Git协议服务器 - 创建HTTP协议服务器 方案: Git支持很多服务器协议形式,不同协议的Git服务器,客户端就可以使用不 ...
- Linux架构之Nginx Web基础1
第41章 Nginx Web基础入门 41.1 Nginx部署 41.1.1 Nginx的安装方式 源码编译 官方仓库 epel仓库 优点 规范 安装简单 安装简单 便于管理 配置易读 缺 ...
- arm算力
arm 算力运算 MIPS: Million Instructions executed Per SecondDMIPS: Dhrystone Million Instructions execute ...
- jmeter post请求在终端传参,并且指定请求参数文件
命令:jmeter -n -t jmeter_1.jmx -l report/report30.jtl -Jnum=3000 -e -o webresult/3000result ...
- linux系统基础的优化以及常用命令
编辑网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改配置参数 ONBOOT= yes启动或者关闭ipsystemctl restart/s ...