C++实现二叉树

代码如下:

#include<iostream>
#include <queue>
#include <stack>
using namespace std;class BinTree
{
private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):data(e),left(nullptr),right(nullptr){}};private:TreeNode *root;public:BinTree():root(nullptr){}void pre_in_buildTree(int *pre, int *in, int n){if (n <= 0){cout << "The tree is null" << endl;return;}root = pre_in_dfsTree(pre, in, 0, n - 1, 0, n - 1);}void in_post_buildTree(int *in, int *post, int n){if (n <= 0){cout << "The tree is null" << endl;return;}root = in_post_dfsTree(in, post, 0, n - 1, 0, n - 1);}void preOrder(){predfsTree(root);cout << endl;}void inOrder(){indfsTree(root);cout << endl;}void postOrder(){postdfsTree(root);cout << endl;}void levelOrder()//层次遍历{if (root == nullptr){cout << "The tree is null" << endl;return;}queue<TreeNode *> q;q.push(root);while (!q.empty()){TreeNode *t = q.front();cout << t->data << " ";q.pop();if (t->left) q.push(t->left);if (t->right) q.push(t->right);}cout << endl;}void preOrder_Stack()//先序遍历(非递归){TreeNode *p = root;stack<TreeNode *> s;while (p || !s.empty()){while (p){cout << p->data << " ";s.push(p);p = p->left;}if (!s.empty()){p = s.top();s.pop();p = p->right;}}cout << endl;}void inOrder_Stack()//中序遍历(非递归){TreeNode *p = root;stack<TreeNode *> s;while (p || !s.empty()){while (p){s.push(p);p = p->left;}if (!s.empty()){p = s.top();cout << p->data << " ";s.pop();p = p->right;}}cout << endl;}void postOrder_Stack()//后序遍历(非递归){stack<TreeNode *>s;s.push(root);while (!s.empty()){TreeNode *t = s.top();s.pop();if (t){s.push(t);s.push(nullptr);if (t->right) s.push(t->right);if (t->left) s.push(t->left);}else{t = s.top();s.pop();cout << t->data << " ";}}cout << endl;}private:TreeNode* pre_in_dfsTree(int *pre, int *in, int o1, int h1, int o2, int h2)//传入先序遍历和中序遍历构造一颗树{if (o1 > h1) return nullptr;int val = pre[o1];TreeNode *root = new TreeNode(val);if (o1 == h1) return root;int mid = 0;while (in[o2 + mid] != val) mid++;root->left = pre_in_dfsTree(pre, in,o1+1 ,o1+mid ,o2,o2+mid-1 );root->right = pre_in_dfsTree(pre, in,o1+mid+1 ,h1 , o2 + mid + 1, h2);return root;}TreeNode * in_post_dfsTree(int *in, int *post, int o1, int h1, int o2, int h2)//传入中序遍历和后序遍历构造一颗树{if (o1 > h1) return nullptr;int val = post[h2];TreeNode *root = new TreeNode(val);if (o1 == h1) return root;int mid = 0;while (in[o1 + mid] != val) mid++;root->left = in_post_dfsTree(in, post, o1, o1+mid-1, o2, o2+mid-1);root->right = in_post_dfsTree(in, post,o1+mid+1 ,h1, o2 + mid, h2-1);return root;}void predfsTree(TreeNode *root)//先序遍历{if (root == nullptr) return;cout << root->data << " ";predfsTree(root->left);predfsTree(root->right);}void indfsTree(TreeNode *root)//中序遍历{if (root == nullptr) return;indfsTree(root->left);cout << root->data << " ";indfsTree(root->right);}void postdfsTree(TreeNode *root)//后序遍历{if (root == nullptr) return;postdfsTree(root->left);postdfsTree(root->right);cout << root->data << " ";}};int main()
{BinTree t1;int pre[] = { 3,9,20,15,7 };int in[] = { 9,3,15,20,7 };int post[] = { 9,15,7,20,3 };t1.pre_in_buildTree(pre, in,5);BinTree t2;t2.in_post_buildTree(in, post, 5);t1.levelOrder();t2.levelOrder();t1.preOrder();t2.preOrder();t1.preOrder_Stack();t1.inOrder();t2.inOrder();t1.inOrder_Stack();t1.postOrder();t2.postOrder();t1.postOrder_Stack();return 0;
}

测试结果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

辅助类KeyNode

#ifndef C11LEARN_KEYNODE_H #define C11LEARN_KEYNODE_H template<typename T> class KeyNode { public:int key{};T value; public:KeyNode() default;KeyNode(int key,const T value):key(key),value(value){} }; #endif //C11LEARN_KEYNODE_H

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …

Vue 3拖更,尤雨溪介绍最新进展

Vue.js 作者尤雨溪近日介绍了 Vue 3 的最新进展。尤雨溪表示&#xff0c;由于在 Vue 3 上花费的大部分时间都投入到了设计和构建稳定的内核上&#xff0c;不过要让整个框架处于"ready"状态&#xff0c;不仅仅是内核的问题&#xff0c;还需要有兼容版本的支持库 &…

位向量(bit vector)(算法导论第十一章11.1-2)

位向量(bit vector) 位向量&#xff08;bit vector&#xff09;是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。说明如何用一个位向量来表示一个包含不同元素&#xff08;无卫星数据&#xff09;的动态集合。字典操作运行时间应为O&#xff08…

Mysql@和@@符号的详细使用说明

一、概述 是用户变量&#xff0c;是系统变量。 二、使用语法及实践 用户自定义变量 1、用户定义变量语法 SET var_name expr [, var_name expr] 如&#xff1a;set t1 100; 2、获取用户定义变量值方式&#xff0c;如&#xff1a; select t1 from dual; 如下图 系统变…

探讨NET Core数据进行3DES加密或解密弱密钥问题

【导读】之前写过一篇《探讨.NET Core数据进行3DES加密和解密问题》&#xff0c;最近看到有人提出弱密钥问题&#xff0c;换个强密钥不就完了吗&#xff0c;猜测可能是与第三方对接导致很无奈不能更换密钥&#xff0c;所以产生本文解决.NET Core中3DES弱密钥问题&#xff0c;写…

算法导论第三版第十一章11.1-4

算法导论第三版第十一章11.1-4 我们希望在一个非常大的数组上&#xff0c;通过利用直接寻址的方式来实现一个字典。开始时&#xff0c;该数组中可能包含一些无用信息&#xff0c;但要堆整个数组进行初始化时不太实际的&#xff0c;因为该数组的规模太大。请给出在大数组上实现…

C++实现表达式树

代码如下: #include <iostream> #include <string> #include <stack> #include <queue> using namespace std;class Tree { private:class Node{public:char val;Node * left;Node *right;Node(char val):val(val),left(nullptr),right(nullptr){}Nod…

Hash-table(用除法散列法实现)

Hash-table&#xff08;用除法散列法实现&#xff09; 关键字只支持int型&#xff0c;初学者版本 用链表解决冲突问题 #ifndef C11LEARN_HASHDIVISION_H #define C11LEARN_HASHDIVISION_H #include "Chain.h" template<typename T> class HashDivision { prot…

redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

前段时间在做用户画像的时候&#xff0c;遇到了这样的一个问题&#xff0c;记录某一个商品的用户购买群&#xff0c;刚好这种需求就可以用到Redis中的Set&#xff0c;key作为productID&#xff0c;value就是具体的customerid集合&#xff0c;后续的话&#xff0c;我就可以通过p…

IDEA如何在包下建立子包

idea如何在包下建立子包 第一次在包下建立子包时候出现了问题 在java > springmvc包下再new上一个package controller的时候就会出现这个样子 如何解决 在IDEA2019 中的Show Options Menu下有一个Compacket Middle Packages将它关闭即可 解决成功

辅助类Chain

辅助类Chain #ifndef C11LEARN_CHAIN_H #define C11LEARN_CHAIN_H template<typename T> class Chain { public:int key;T value;Chain<T> *prev;Chain<T> *next; public:Chain(){}Chain(int key,const T value):key(key),value(value){} }; #endif //C11LEA…

.NET Core微服务开发选项

微服务开发的关注点有哪些&#xff1f;微服务构最终的目标是实现业务的价值&#xff0c;交付&#xff0c;为了让开发人员更加关注业务开发和交付&#xff0c;微服务需要一些比较底层的基础设置&#xff0c;我们也称为微服务公共关注点。配置管理&#xff1a;对微服务可变参数进…

常见的HTTP状态码(HTTP Status Code)说明

作为一个互联网开发人员对于一些服务器返回的HTTP状态的意思都必须是了如指掌的&#xff0c;只有将这些状态码一一弄清楚&#xff0c;工作中遇到的各种问题才能够处理的得心应手。好了&#xff0c;下面就让我们来了解一下比较常见的HTTP状态码吧&#xff01; 2开头 &#xff0…

.NET 开源项目 StreamJsonRpc 介绍[上篇]

StreamJsonRpc 是一个实现了 JSON-RPC 通信协议的开源 .NET 库&#xff0c;在介绍 StreamJsonRpc 之前&#xff0c;我们先来了解一下 JSON-RPC。JSON-RPC 介绍JSON-RPC 是一个无状态且轻量级的远程过程调用&#xff08;RPC&#xff09;协议&#xff0c;其使用 JSON&#xff08;…

hash table(用乘法散列法实现)

hash table(用乘法散列法实现&#xff09; #ifndef C11LEARN_HASHMULTI_H #define C11LEARN_HASHMULTI_H #include "HashDivision.h" template<typename T> class HashMulti:public HashDivision<T> { private:long w;long p;long long s;long long two_…

gRPC真要取代WebApi了,你还学得过来吗?

今年1月份微软曾宣布要实验性的对.NET支持 gRPC-Web&#xff0c;然后在6月份已经正式发布了。这些天尝试了下&#xff0c;真的很强大&#xff0c;不负责任的预言下&#xff0c;RESTful的时代即将过去&#xff0c;而gRPC要成为革命者&#xff01;先别急眼&#xff0c;下面我来详…

hash table(开放寻址法-线性探查实现的哈希表)

hash table(开放寻址法-线性探查实现的哈希表&#xff09; // // Created by 许加权 on 2021/7/17. //#ifndef C11LEARN_HASHLINER_H #define C11LEARN_HASHLINER_H #include "KeyNode.h" template<typename T> class HashLiner { public:HashLiner();HashLin…

Spring5 jar包下载

下载地址 https://repo.spring.io/simple/libs-release-local/org/springframework/spring/ Spring5最新版本的下载 选择最新版本5.2.3 下载前两项&#xff0c;解压放入文件夹中 项目中导包 ps&#xff1a;我使用的开发工具是idea 第一步&#xff1a;在file中选择project st…