二叉树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树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
随机推荐
- python3 使用 django-xadmin 遇到的许多坑
几乎所有公司项目都是python2的, xadmin对Python2 很友好,对Python3 很不友好, 所以在Python3 环境下使用xadmin遇到了许多意想不到的坑,在这里记录并分享一下: ...
- nginx-博客阅读笔记记录-20190916
Nginx 入门学习教程 Ng官网解释: nginx [engine x]是最初由Igor Sysoev编写的HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器. 维基百科解释 ...
- CF671D Roads in Yusland
一道很玄妙的题= = 我们考虑先考虑DP 那么有$f[x]=min(c+\sum f[y])$ $f[x]$表示覆盖x的子树和x->fa[x]的所有边最小代价 我们枚举一条边c覆盖的x-> ...
- ssm框架整合抽取BaseDao接口
import java.io.Serializable; import java.util.List; /** * DAO基础操作模板 * * @param <T> 泛型 */ publi ...
- ATM机取款过程
假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码,最多只能输入三次,超过3次则提示用户“密码错误,请取卡”结束交易.如果用户密码正确,再提示用户输入取款金额,ATM机只能输出100元的纸 ...
- Sublime-Text macOS 编译运行armadillo
{ "cmd" : ["g++ -std=c++14 -Wall -larmadillo -framework Accelerate ${file_name} -o ${ ...
- 演示Git使用
对于新建的repository,第一次提交,完整过程: 13643@DESKTOP-K6CS6SE MINGW64 ~/Desktop/555 $ ls Readme.md run.py 13643@ ...
- win7 开机,或重启自动启动 该文件下的
win7 开机,或重启自动启动 该文件下的: 把桌面上快捷键放入文件内就行 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start ...
- Ckeditor IE下粘贴word中图片问题
自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...
- 顺序表 C++ 类模板实现
顺序表的C++语言描述 基本运算的算法——置空表.求表的长度.取结点.定位运算.插入运算.删除运算.建立顺序表.输出顺序表 #include <iostream>using namespa ...