二叉树的创建是个麻烦事,我的思路是:首先将一个普通的二叉树转化为满二叉树,其中的空节点用一些标识数据来代替,如此一来,就可以用数组索引来描述数据在二叉树的什么位置了。

比如,数组[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++ 手动创建二叉树,并实现前序、中序、后序、层次遍历的更多相关文章

  1. LeetCode:二叉树的前、中、后序遍历

    描述: ------------------------------------------------------- 前序遍历: Given a binary tree, return the pr ...

  2. leetcode(144,94,145,102)中迭代版的二叉树的前、中、后、层级遍历

    //前序遍历class Solution{ public: vector<int> preorderTraversal(TreeNode *root){ vector<int> ...

  3. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  4. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

  6. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  7. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  8. 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树

    已知 中序&后序  建立二叉树: SDUT 1489 Description  已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input  输入数据有多组,第一行是一个整数t (t& ...

  9. 【C&数据结构】---关于链表结构的前序插入和后序插入

    刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...

  10. 【11】-java递归和非递归二叉树前序中序后序遍历

    二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...

随机推荐

  1. 交叉编译esp8089

    交叉编译esp8089 编译环境: 硬件:全志R528 ubuntu:Linux ubuntu 4.15.0-194-generic #205-Ubuntu SMP Fri Sep 16 19:49: ...

  2. File的概述-File类的静态成员变量

    File的概述 java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方法 public File(String pathname)︰通过将给定的路 ...

  3. Object类中wait带参方法和notifyAll方法-线程间通信

    Object类中wait带参方法和notifyAll方法 void wait (在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待.void wait  (lo ...

  4. 【随笔记】T507 ADC SGM58031 16BIT 4Channel 调试记录

    文章介绍 本文主要描述在 T507 Android 10 Linux 4.9 平台下,调试 SGM58031 芯片的记录,实现单芯片实时采集外部四通道的电压数值. 芯片介绍 SGM58031 是一款低 ...

  5. SQL Case条件判断SQL

    问题描述:在表中取到一些值做出判断,配合监控监测一些表中的数据.使用select case when if 来做条件查询判断 CASE 表达式遍历条件并在满足第一个条件时返回一个值(类似于 if-th ...

  6. 力扣---1137. 第 N 个泰波那契数

    泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契 ...

  7. Vue中组件和插件的区别

    一.组件是什么 1:组件的定义: 组件就是把图形.非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在Vue中每一个.vue文件都可以视为一个组件 2:组件的优势 降低整个系统的耦合度, ...

  8. 调用后台接口实现Excel导出功能以及导出乱码问题解决

    实现效果 在导出表格数据的时候,通常分为两种情况 页面列表数据导出 接口返回数据导出 这里主要介绍接口返回数据导出,关于页面的列表数据导出,请看另一篇:vue3+element表格数据导出 接口返回数 ...

  9. 微信小程序-【转发好友】以及中文标题乱码问题解决

    微信小程序的转发功能,参考官方文档,使用的buttom的open-type功能,下面是转发功能的具体实现. // 通过按钮的 open-type="share"实现转发,触发onS ...

  10. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(7)-Charles苹果手机手机抓包知否知否?

    1.简介 Charles和Fiddler一样不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求. Charles也能截获iOS设备发出的请求,比如 i ...