C++ class实现二叉树(完整代码,附非递归遍历)

代码如下:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef char ElemType;
int InOrder_count = 0;class BinTreeNode {friend class BinaryTree;public:BinTreeNode(): lchild(NULL), rchild(NULL) {};private:ElemType data;BinTreeNode *lchild;BinTreeNode *rchild;
};class BinaryTree {public:BinaryTree(): root(NULL) {};~BinaryTree() {DeleteTree();}//cur是current的缩写bool Insertlchild(BinTreeNode *cur, ElemType e);bool InsertRchild(BinTreeNode *cur, ElemType e);void LevelOrder(BinTreeNode *cur);void PreOrder(BinTreeNode *cur);void InOrder(BinTreeNode *cur);void PostOrder(BinTreeNode *cur);void PreOrder_Stack(BinTreeNode *cur);void InOrder_Stack(BinTreeNode *cur);void PostOrder_Stack(BinTreeNode *cur);void   InOrder_Count(BinTreeNode *cur);BinTreeNode *&visRoot();BinTreeNode *Root();int Count(BinTreeNode *cur);int Height(BinTreeNode *cur);BinTreeNode *copyTree(BinTreeNode *t);BinTreeNode *Find (BinTreeNode *cur, ElemType e);void Destory(BinTreeNode *cur);//删除指点子树void DeleteTree() {Destory(root);root = NULL;}bool IsEmpty() {return root == NULL;}BinTreeNode *CreateTree();//以先序序列输入private:BinTreeNode *root;
};bool BinaryTree::Insertlchild(BinTreeNode *cur, ElemType e) {if (cur == NULL)return false;BinTreeNode *p;p = new BinTreeNode();p->data = e;cur->lchild = p;return true;
}bool BinaryTree::InsertRchild(BinTreeNode *cur, ElemType e) {if (cur == NULL)return false;BinTreeNode *p;p = new BinTreeNode();p->data = e;cur->rchild = p;return true;
}void BinaryTree::Destory(BinTreeNode *cur) {if (cur != NULL) {Destory(cur->lchild);Destory(cur->rchild);delete cur;}
}BinTreeNode *BinaryTree::Find(BinTreeNode *cur, ElemType e) {if (cur == NULL)return NULL;if (cur->data == e)return cur;BinTreeNode *p = Find(cur->lchild, e);if (p != NULL)return p;elsereturn Find(cur->rchild, e);
}void BinaryTree::PreOrder(BinTreeNode *cur) {if (cur != NULL) {cout << cur->data << " ";PreOrder(cur->lchild);PreOrder(cur->rchild);}
}void BinaryTree::InOrder(BinTreeNode *cur) {if (cur != NULL) {InOrder(cur->lchild);cout << cur->data << " ";InOrder(cur->rchild);}
}void BinaryTree::PostOrder(BinTreeNode *cur) {if (cur != NULL) {PostOrder(cur->lchild);PostOrder(cur->rchild);cout << cur->data << " ";}
}void BinaryTree::PreOrder_Stack(BinTreeNode *cur) {stack<BinTreeNode *>s;while (cur || !s.empty())if (cur) {cout << cur->data << " ";s.push(cur);cur = cur->lchild;} else {cur = s.top();s.pop();cur = cur->rchild;}
}void BinaryTree::InOrder_Stack(BinTreeNode *cur) {stack<BinTreeNode *>s;while (cur || !s.empty())if (cur) {s.push(cur);cur = cur->lchild;} else {cur = s.top();s.pop();cout << cur->data << " ";cur = cur->rchild;}
}void BinaryTree::PostOrder_Stack(BinTreeNode *cur) {stack<BinTreeNode *>s1;stack<bool>s2;bool flag;while (cur || !s1.empty())if (cur) {flag = false;s1.push(cur);s2.push(flag);cur = cur->lchild;} else {cur = s1.top();flag = s2.top();s1.pop();s2.pop();if (flag == false) {flag = true;s1.push(cur);s2.push(flag);cur = cur->rchild;} else {cout << cur->data << " ";cur = NULL;}}
}void   BinaryTree::InOrder_Count(BinTreeNode *cur) {if (cur != NULL) {InOrder_Count(cur->lchild);InOrder_count++;//InOrder_count为全局变量,使用前要赋值为0InOrder_Count(cur->rchild);}
}int BinaryTree::Count(BinTreeNode *cur) {int lcnt, rcnt;if (cur == NULL)return 0;lcnt = Count(cur->lchild);rcnt = Count(cur->rchild);return lcnt + rcnt + 1;
}int BinaryTree::Height(BinTreeNode *cur) {if (cur == NULL)return 0;elsereturn max(Height(cur->lchild), Height(cur->rchild)) + 1;
}BinTreeNode *BinaryTree::copyTree(BinTreeNode *t) {if (t == NULL)return NULL;BinTreeNode *p;p = new BinTreeNode();p->data = t->data;p->lchild = copyTree(t->lchild);p->rchild = copyTree(t->rchild);return p;
}BinTreeNode *BinaryTree::CreateTree() {ElemType ch;BinTreeNode *t;cin >> ch;if (ch == '0')t = NULL;else {t = new BinTreeNode();t->data = ch;t->lchild = CreateTree();t->rchild = CreateTree();}return t;
}BinTreeNode *BinaryTree::Root() {return root;
}BinTreeNode *&BinaryTree::visRoot() {return root;
}void BinaryTree::LevelOrder(BinTreeNode *cur) {if (cur == NULL)return ;queue<BinTreeNode *>q;q.push(cur);while (q.size()) {BinTreeNode *t = q.front();q.pop();if (t == NULL)continue;cout << t->data << " ";q.push(t->lchild);q.push(t->rchild);}
}int main() {BinaryTree T;T.visRoot() = T.CreateTree();T.PreOrder(T.visRoot());cout << endl;T.InOrder(T.visRoot());cout << endl;T.PostOrder(T.visRoot());cout << endl;cout << "-----------------------------------" << endl;T.PreOrder_Stack(T.visRoot());cout << endl;T.InOrder_Stack(T.visRoot());cout << endl;T.PostOrder_Stack(T.visRoot());cout << endl;T.LevelOrder(T.visRoot());cout << endl;char c1;cin >> c1;char c2;cin >> c2;T.Insertlchild(T.Find(T.visRoot(), c1), c2);T.PreOrder(T.visRoot());cout << endl;cout << T.Height(T.visRoot()) << endl;T.InOrder_Count(T.visRoot());cout << InOrder_count << endl;//全局变量,使用前要赋值为0cout << T.Count(T.visRoot()) << endl;return 0;
}

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

在这里插入图片描述在D中的左孩子位置插入K后,其结构如图所示:

在这里插入图片描述
在这里插入图片描述
非递归遍历代码链接:

  1. C++
    实现二叉树的非递归遍历(栈实现)
  2. C++
    实现二叉树的非递归层次遍历(队列实现)

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

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

相关文章

服务器水冷系统仿真,水冷漫谈(三)——水冷散热器仿真方法

水冷散热器的精细化设计是需要借助仿真软件的。目前可以完成水冷仿真的商业软件有很多种&#xff0c;各有优势&#xff0c;在此不做对比。Jason用的是FloTHERM&#xff0c;但是主要的分析方法是一致的。不同于风冷的系统&#xff0c;水冷整个系统比较庞大和复杂。工程中一般不会…

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

在这篇文章中&#xff0c;我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业。这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态。接下来我将演示如何创建一个简单的 IJob&#xff0c;一个自定义的 IJobFactory和一个在应用程序运行时就开…

分享一些支持多租户的开源框架

如果你在开发sass应用程序&#xff0c;可以参考或者直接使用这些开源的框架。ASP.NET Boilerplate — Web应用程序框架ASP.NET Boilerplate是专门为新的现代Web应用程序设计的通用应用程序框架。它使用已经熟悉的工具并围绕它们实施最佳实践&#xff0c;以为您提供SOLID开发经验…

服务器操作系统用什么好,服务器操作系统一般用什么

服务器操作系统一般用什么 内容精选换一换客户的SAP系统部署在第三方云&#xff0c;服务器操作系统在华为云支持的列表内&#xff0c;数据库为任意数据库&#xff0c;同时还有如对象存储等的其他云服务。迁移到华为云后&#xff0c;数据库以及操作系统保持不变&#xff0c;系统…

一张大图了解ASP.NET Core 3.1 中的Authentication与Authorization

下面是一张ASP.NET Core 3.1 中关于Authentication与Authorization的主流程框线图&#xff0c;点击这里查看全图&#xff1a;https://johnnyqian.net/images/202004/aspnet-core-3.1-request-processing-pipeline.png重要组件一些重要的组件及其源码链接如下&#xff1a;Authen…

C++ class实现完全二叉树的顺序存储结构

代码如下: #include <iostream> using namespace std; const int maxsize 100; typedef char ElemType;class QbTree {public:void CreateBTree(int n);int vislchild(int i);int visrchild(int i);int visparent(int i);ElemType viselem(int i);void LevelOrder();p…

研发协同平台持续集成Jenkins作业设计演进

源宝导读&#xff1a;Jenkins作为一个开源的持续集成工具&#xff0c;被大家广泛使用。本文将分享&#xff0c;Jenkins在明源云研发协同平台中的运用&#xff0c;以及在其作业设计方面的演进历程。一、作业设计1.0起初&#xff0c;为了尽快推出研发协同平台v1.0&#xff0c;我们…

一切都要从华为云 CloudIDE 酷似 VS Code 说起

前不久&#xff0c;有个关于华为云 CloudIDE 的问题在知乎、朋友圈、微博等圈子引起了广泛的讨论&#xff0c;甚至上了知乎热榜。那么&#xff0c;背后的真实情况到底是如何的&#xff1f;且听韩老师娓娓道来。华为云 CloudIDE 酷似 VS Code&#xff1f;首先要明确一点&#xf…

C++ class实现双亲表示法

#include <iostream> using namespace std; typedef char ElemType; const int MAXSIZE 100;class TreeNode {friend class Tree; private:ElemType data;int parent; };class Tree { private:TreeNode elem[MAXSIZE];int n;//树中当前的节点个数 }Tree;

单元测试:如何编写可测试的代码及其重要性

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者&#xff1a;谢尔盖科洛迪&#xff08;SERGEY KOL…

C++ class实现孩子表示法

代码如下: #include <iostream> using namespace std; typedef char ElemType; const int MAXSIZE 100;class link {friend class Node; private:int child;link *next; };class Node {friend class Tree; private:ElemType data;link *first; };class Tree { private:…

IdentityServer 部署踩坑记

IdentityServer 部署踩坑记Intro周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目&#xff0c;踩了几个坑&#xff0c;在此记录分享一下。部署架构项目是基于 IdentityServerAdmin 项目修改的&#xff0c;感谢作者的开源付出&#xff0c;有需要 IdentityServer 管…

.Net Core微服务架构技术栈的那些事

一、前言大家一直都在谈论微服务架构&#xff0c;园子里面也有很多关于微服务的文章&#xff0c;前几天也有一些园子的朋友问我微服务架构的一些技术&#xff0c;我这里就整理了微服务架构的技术栈路线图&#xff0c;这里就分享出来和大家一起探讨学习&#xff0c;同时让新手对…

C++ class实现Huffman树(完整代码)

代码如下: #include <iostream> #include <string> using namespace std; const unsigned int n 8;//字符数NUM&#xff0c;这里的字符数为8 const unsigned int m 2 * n - 1;//结点总数 const float MAX 1e8;class HTNode {friend class HuffmanTree; private…

二叉树的遍历(堆栈)

二叉树的遍历&#xff08;堆栈&#xff09; 如何理解用堆栈方式代替递归去遍历二叉树&#xff0c;关键点在于了解每个结点输出时的顺序&#xff0c;以及理解前序中序后序是如何遍历的&#xff0c;这点很重要&#xff0c;可以自己画一个树图&#xff0c;熟练写出遍历的结果 以…

ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

任务10&#xff1a;第三方ClientCredential模式调用创建一个控制台程序dotnet new console --name ThirdPartyDemo添加 Nuget 包&#xff1a;IdentityModel添加之后还原dotnet restoreClientusing System; using System.Net.Http; using System.Threading.Tasks; using Identit…

C++ class实现邻接矩阵存储的图(完整代码)

代码如下: #include <iostream> #include <queue> using namespace std; typedef int VertexType; typedef int EdgeType; const int MaxVertexNum 30;class MGraph { public:MGraph(){CreatGraph();};void CreatGraph();void Visit(int v);void BFS(int v);void…

二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚&#xff0c;无非就是左小右大 创建二叉搜索树&#xff0c;其实就是多次调用二叉搜索树的插入方法&#xff0c;所以首先我们来讲讲如何插入节点到二叉搜索树里&#xff0c;假设一颗二叉搜索树如下&#xff0c;现在要插入…

.NET 的过去、现在和未来

作为一名使用了十多年.NET 开发平台的开发者来说&#xff0c;多年来笔者鲜少在各类博客媒体推广布道 .NET平台&#xff0c;但也默默地关注着 .NET 平台的发展变化&#xff0c;为每一次新技术的出现欢呼&#xff0c;为近年来 .NET 的沉默感到惋惜&#xff0c;也为开放开源的 .NE…

AVL树(平衡二叉树)讲解,入门篇,适合新手观看

1.1 概念 平衡二叉树就是为了让二叉搜索树的平均查找长度更短&#xff0c;时间复杂度更靠近logN,如果一个二叉搜索树不平衡了就会出现图1情况&#xff0c;完全变成一个数组&#xff0c;时间复杂度也变为了O(N)。 平衡因子&#xff1a;平衡因子就是针对于树中某一结点&#xff…