C++ 手动创建二叉树,并实现前序、中序、后序、层次遍历
二叉树的创建是个麻烦事,我的思路是:首先将一个普通的二叉树转化为满二叉树,其中的空节点用一些标识数据来代替,如此一来,就可以用数组索引来描述数据在二叉树的什么位置了。
比如,数组[2,4,3,1,5,-1,-1] 就可以表示一个三层的二叉树,具体长这样:
对于四种遍历方法,前序、中序、后序、层次遍历方法,给出了递归和迭代两种方式
具体代码如下:
#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
using namespace std;
/*实现普通二叉树的创建,以及四种遍历方法*/
template <typename T>
class Node {
public:
T val = 0;
Node<T>* lchild = nullptr;
Node<T>* rchild = nullptr;
Node(T& a): val(a){}
};
template <typename T>
class BinTree {
public:
Node<T>* root = nullptr;
BinTree(vector<T>& value, int n);
void creatTree(Node<T>*& p, vector<T>& value, int n, const int len);
void preOrder1(Node<T>* p); //递归
void preOrder2(); //迭代
void inOrder1(Node<T>* p); //递归
void inOrder2(); //迭代
void postOrder1(Node<T>* p); //递归
void postOrder2(); //迭代
void levelOrder();
void visit(Node<T>* p);
};
template <typename T>
BinTree<T>::BinTree(vector<T>& value, int n) {
if ( value.size() != pow(2, n)-1 ) {//树的高度与元素个数不匹配
cout << " elements not match to level " << endl;
return;
}
creatTree(root, value, 0, pow(2, n)-1 );
}
template <typename T>
void BinTree<T>::creatTree(Node<T>*& p, vector<T>& value, int n, const int len) {
if ( n < len && value[n] != -1 ) {
p = new Node<T> (value[n]);
creatTree(p->lchild, value, 2*n+1, len); //创建左子树
creatTree(p->rchild, value, 2*(n+1), len); //创建you子树
}
}
template <typename T>
void BinTree<T>::visit(Node<T>* p) {
cout << p->val << " ";
}
template <typename T>
void BinTree<T>::preOrder1(Node<T>* p) {
if (p) {
visit(p);
preOrder1(p->lchild);
preOrder1(p->rchild);
}
}
template <typename T>
void BinTree<T>::inOrder1(Node<T>* p) {
if (p) {
inOrder1(p->lchild);
visit(p);
inOrder1(p->rchild);
}
}
template <typename T>
void BinTree<T>::postOrder1(Node<T>* p) {
if (p) {
postOrder1(p->lchild);
postOrder1(p->rchild);
visit(p);
}
}
template <typename T>
void BinTree<T>::preOrder2() {
stack<Node<T>*> st;
Node<T>* p = this->root;
st.push(p->rchild);
visit(p);
while ( !st.empty() ) {
if ( p->lchild )
p = p->lchild;
else {
p = st.top();
st.pop();
}
visit(p);
if ( p->rchild )
st.push(p->rchild);
}
}
template <typename T>
void BinTree<T>::inOrder2() {
stack<Node<T>*> st;
Node<T>* p = this->root;
while ( p || !st.empty() ) {
if (p) {
st.push(p);
p = p->lchild;
}
else {
p = st.top();
st.pop();
visit(p);
p = p->rchild;
}
}
}
template <typename T>
void BinTree<T>::postOrder2() {
//太难了,cpu快想炸了,摆了
}
template <typename T>
void BinTree<T>::levelOrder() {
queue<Node<T>*> Q;
Node<T>* p = this->root;
Q.push(p);
while ( !Q.empty() ) {
p = Q.front();
Q.pop();
visit(p);
if ( p->lchild )
Q.push(p->lchild);
if ( p->rchild )
Q.push(p->rchild);
}
}
void sets(int* n) {
n = new int (3);
}
int main() {
vector<int> a = {2,4,3,1,5,-1,-1};
a.shrink_to_fit();
BinTree<int> *b = new BinTree<int> (a, 3);
cout << b->root->val << " ";
cout << b->root->lchild->val << " ";
cout << b->root->rchild->val << " ";
cout << b->root->lchild->lchild->val << " ";
cout << b->root->lchild->rchild->val << endl;
cout << "前序遍历(递归): ";
b->preOrder1(b->root);
cout << "\n中序遍历(递归): ";
b->inOrder1(b->root);
cout << "\n后序遍历(递归): ";
b->postOrder1(b->root);
cout << "\n前序遍历(迭代): ";
b->preOrder2();
cout << "\n中序遍历(迭代): ";
b->inOrder2();
cout << "\n层次遍历: ";
b->levelOrder();
cout << endl;
var code = "93e77dd0-c6ba-4c8a-bc02-31555a7fa65d"
}
C++ 手动创建二叉树,并实现前序、中序、后序、层次遍历的更多相关文章
- LeetCode:二叉树的前、中、后序遍历
描述: ------------------------------------------------------- 前序遍历: Given a binary tree, return the pr ...
- leetcode(144,94,145,102)中迭代版的二叉树的前、中、后、层级遍历
//前序遍历class Solution{ public: vector<int> preorderTraversal(TreeNode *root){ vector<int> ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 前序+中序->后序 中序+后序->前序
前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...
- SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
- 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树
已知 中序&后序 建立二叉树: SDUT 1489 Description 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input 输入数据有多组,第一行是一个整数t (t& ...
- 【C&数据结构】---关于链表结构的前序插入和后序插入
刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...
- 【11】-java递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
随机推荐
- Java 进阶P-4.6+P-4.7
向上造型 造型cast 子类的对象可以赋值给父类的变量 注意! java中不存在对象对对象的赋值!! 父类的对象不能赋值给子类的变量 可以用造型: c=(Car) v; (只有当v这个变量实际管理的是 ...
- 获取对象的方式-Calendar类的常用成员方法
获取对象的方式 java.utiL.calendar类:日历类caLendar类是一个抽象类,里边提供了很多操作日历字段的方法(YEAR.MONTH.DAY_OF_MONTH.HOUR )CaLend ...
- 职场IT老手教你3步教你玩转可视化大屏设计,让领导眼前一亮!
我是制造企业的IT中心的研发人员,平常工作就是配合业务部门出出报表,选型一些商业软件,并在内部负责实施运维.最近领导出去参观了一些数字化转型比较领先的工厂和制造企业,回来就甩给我几张图,问能不能我们也 ...
- Cow Picnic S 更新了(在后面)
解题思路: 从每头奶牛的节点开始做搜索,用dfs走遍所有路径(走到底,不回头).每遍历到一个节点该节点遍历次数就加一,最后所有奶牛都搜索完之后,检查每个节点的遍历次数,如果该节点的遍历次数等于奶牛数则 ...
- C-04\IDE基础知识和分支,循环语句
一.浮点数特性及比较方法 浮点数在多参数传参的时候默认是会进行精度转换,由float转换到double,浮点数是一个近视值,不能进行直接等于比较,一般可以用区间法比较但是会存在精度丢失的问题. 浮点数 ...
- 华为云发布分布式编译构建系统CodeArts Build
摘要:2月14日,华为云发布分布式编译构建系统CodeArts Build,旨在支撑企业实现高效的软件开发,缩短产品上市周期,帮助企业的软件产品快速形成关键竞争力. 本文分享自华为云社区<唯快不 ...
- 树莓派4B安装OPENCV4.0
参考 : https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/ Step #1: Expand ...
- Nodejs 使用 ZooKeeper 做服务发现
将单体服务拆分为微服务后,为了服务高可用,一般会做集群多实例.但在分布式下,怎么进行高效.便捷的进行服务访问问题,出现了各类服务注册和服务发现框架.这里使用的是Zookeeper.ZooKeeper ...
- 我做的百度飞桨PaddleOCR .NET调用库
我做的百度飞桨PaddleOCR .NET调用库 .NET Conf 2021中国我做了一次<.NET玩转计算机视觉OpenCV>的分享,其中提到了一个效果特别好的OCR识别引擎--百度飞 ...
- Autoit 制作上传工具完美版
一. 制作上传器 在ui自动化过程中经常遇到需要上传的动作,我们可以使用input标签来送值,但这样不太稳定,所以建议使用autoit制作出来的exe工具. 下面就教大家如何制作上传器,如何使用吧! ...