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递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
随机推荐
- 微软外服札记④——Spark中的那些坑...
Spark中的那些坑 Spark中的那些坑 前言 读取配置文件 时区陷阱 怪异的DayOfWeek substring陷阱 IP地址解析 枚举的数值 posexplode函数 为什么我的程序运行那么慢 ...
- Stream中的常用方法_count-Stream中的常用方法_limit
package A_Lian_two.D04; import java.util.stream.Stream; public class Demo06Stream_limit { public sta ...
- mysql18-Show Profile和全局日志
1.是什么 分析SQL执行带来的开销是优化SQL的重要手段.在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析.该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上 ...
- Vue的介绍
目录 Vue介绍 一.前端发展史 二.Vue介绍 1.Vue是什么? 2.M-V-VM 架构思想 3.组件化开发.单页面应用 4.版本问题 三.第一个helloworld 1.了解开发前端的编辑器 2 ...
- Slf4j+log4j日志使用
适用于Maven项目 1.依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j- ...
- qt元对象系统之 Q_OBJECT宏
宏展开是这样 #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QM ...
- 安卓逆向4.xpsoed hook构造方法
大纲 获取所有类 获取所有字段 或者所有方法 1.获取所有类 并打印 2.遍历所有字段 3.遍历所有方法 集合 由于回家了,懒得敲代码,所以就这样了
- JZOJ 1082. 【GDOI2005】选址
\(\text{Problem}\) 很久以前,在世界的某处有一个形状为凸多边形的小岛,岛上的居民们决定建一个祭坛,居民们任务祭坛的位置离岛的顶点处越远越好. 你的任务是求凸多边形内一点,使其与各顶点 ...
- Naughty Stone Piles
题目:http://codeforces.com/problemset/problem/227/D 题意:n堆个数石子,每堆石子有ai个,通过合并(即将一堆石子移到另一堆石子上),将所有石子合并为一堆 ...
- MySQL创建表的三种方式
创建表的三种方式 通过create语句直接创建 语法: create [TEMPORARY] table [IF NOT EXISTS] table_name ( col_name column_de ...