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

比如,数组[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. C艹 里 printf 和 cout 的区别总结

    1. printf里面打出%需要连着打出两次 打出一次默认为格式标识符 打出两次: 2. 当 未完待续

  2. flutter 2.x运行flutter run 报错Cannot run with sound null safety, because the following dependenciesdon'

    flutter 2.x运行flutter run 报错Cannot run with sound null safety, because the following dependenciesdon' ...

  3. Docker+nginx部署前后端分离项目

    1.下载Docker和Docker-Compose 1.安装Docker 记一次踩坑:误装podman-docker 问题概述:Centos8去下载Docker时,默认装的是podman-docker ...

  4. 让Apache Beam在GCP Cloud Dataflow上跑起来

    简介 在文章<Apache Beam入门及Java SDK开发初体验>中大概讲了Apapche Beam的简单概念和本地运行,本文将讲解如何把代码运行在GCP Cloud Dataflow ...

  5. pycharm设置python头文件模版

    钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. 使用pycharm创建python文件时候,有时候需要自动生成想要的文件头,如何生成呢? 只需要以下几步: 在fi ...

  6. RISC-V 平台移植 RTOS

        ARM 上移植实时操作系统大家可能比较熟悉,且例程较多,对于 RISC-V 内核的 MCU,可能相对比较陌生.下面结合 WCH 的 CH32V103 和 CH32V307 两款芯片来详细说下针 ...

  7. 打开sublime text3 弹出错误提示 Error trying to parse settings: Expected value inPackages\UserJSONsublime-settings:13:17

    问题:打开sublime text3 弹出错误提示 Error trying to parse settings: Expected value inPackages\UserJSONsublime- ...

  8. 12月14日内容总结——模板层之标签、自定义模板语法、母版(模版)的继承与导入、模型层前期准备知识点、ORM常用关键字

    目录 一.模板层之标签 分支结构if for循环 with(定义变量名) 二.自定义过滤器.标签及inclusion_tag(了解) 三.母版(模板)的继承与导入(重要) 四.模型层之前期准备 模型层 ...

  9. Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

    前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置 概述 在分析 K8S 集 ...

  10. 多功能游戏工具箱 - Watt Toolkit V4.4

    Watt Toolkit Watt Toolkit 工具箱能够让 Steam 平台的玩家们享受更加出色的游戏体验,工具箱包含多种实用的功能,支持快速切换登录账号,玩家还可以通过这款工具编辑 Steam ...