1. 编写一个程序btree.cpp,实现二叉树的链式存储结构以及二叉树的各种基本运算:CreateBTree(根据顺序字符串表示创建二叉树,参考课本P232例7.19或课件)、DestroyBTree(销毁二叉树)、FindNode(查找结点)、BTHeight(求二叉树的高度)、DispBTree(用括号表示法输出二叉树)、PreOrder(先序遍历)、InOrder(中序遍历)、PostOrder(后序遍历),LevelOrder(层次遍历)并在此基础上设计一个程序exp5-1.cpp,完成以下功能: (1)二叉树顺序串表示为"ABCDEFG##H####I####JK####################LM",根据此串创建二叉树b (2)输出二叉树b (3)输出二叉树b的高度 (4)先序遍历b (5)中序遍历b (6)后序遍历b (7)层次遍历b (8)查找'M'结点是否存在 (9)查找'N'结点是否存在 (10)释放二叉树b

时间: 2023-09-15 07:16:07 浏览: 97
好的,我已经记录下来了。以下是btree.cpp的代码实现,可以作为参考: ```c++ #include <iostream> #include <queue> #include <cstring> using namespace std; typedef struct BNode { char data; struct BNode *lchild, *rchild; } BNode, *BTree; // 创建二叉树 void CreateBTree(BTree &T, char *s, int &i) { if (s[i] == '#') // 如果是'#'说明该节点为空 { T = NULL; i++; } else { T = new BNode; T->data = s[i]; i++; CreateBTree(T->lchild, s, i); // 递归创建左子树 CreateBTree(T->rchild, s, i); // 递归创建右子树 } } // 销毁二叉树 void DestroyBTree(BTree &T) { if (T != NULL) { DestroyBTree(T->lchild); // 递归销毁左子树 DestroyBTree(T->rchild); // 递归销毁右子树 delete T; T = NULL; } } // 查找结点 BNode* FindNode(BTree T, char x) { if (T == NULL) return NULL; else if (T->data == x) return T; else { BNode* p = FindNode(T->lchild, x); if (p != NULL) return p; else return FindNode(T->rchild, x); } } // 求二叉树的高度 int BTHeight(BTree T) { if (T == NULL) return 0; else { int leftHeight = BTHeight(T->lchild); int rightHeight = BTHeight(T->rchild); return max(leftHeight, rightHeight) + 1; } } // 用括号表示法输出二叉树 void DispBTree(BTree T) { if (T != NULL) { cout << T->data; if (T->lchild != NULL || T->rchild != NULL) { cout << '('; DispBTree(T->lchild); if (T->rchild != NULL) cout << ','; DispBTree(T->rchild); cout << ')'; } } } // 先序遍历 void PreOrder(BTree T) { if (T != NULL) { cout << T->data << " "; PreOrder(T->lchild); PreOrder(T->rchild); } } // 中序遍历 void InOrder(BTree T) { if (T != NULL) { InOrder(T->lchild); cout << T->data << " "; InOrder(T->rchild); } } // 后序遍历 void PostOrder(BTree T) { if (T != NULL) { PostOrder(T->lchild); PostOrder(T->rchild); cout << T->data << " "; } } // 层次遍历 void LevelOrder(BTree T) { if (T == NULL) return; queue<BNode*> q; q.push(T); while (!q.empty()) { BNode* p = q.front(); q.pop(); cout << p->data << " "; if (p->lchild != NULL) q.push(p->lchild); if (p->rchild != NULL) q.push(p->rchild); } } int main() { char s[] = "ABCDEFG##H####I####JK####################LM"; BTree b = NULL; int i = 0; CreateBTree(b, s, i); cout << "二叉树b的括号表示法为: "; DispBTree(b); cout << endl; cout << "二叉树b的高度为: " << BTHeight(b) << endl; cout << "二叉树b的先序遍历为: "; PreOrder(b); cout << endl; cout << "二叉树b的中序遍历为: "; InOrder(b); cout << endl; cout << "二叉树b的后序遍历为: "; PostOrder(b); cout << endl; cout << "二叉树b的层次遍历为: "; LevelOrder(b); cout << endl; BNode* p = FindNode(b, 'M'); if (p != NULL) cout << "找到了'M'结点" << endl; else cout << "没有找到'M'结点" << endl; p = FindNode(b, 'N'); if (p != NULL) cout << "找到了'N'结点" << endl; else cout << "没有找到'N'结点" << endl; DestroyBTree(b); return 0; } ``` 接下来是exp5-1.cpp的代码实现,它直接调用了btree.cpp中的函数实现了题目中要求的功能: ```c++ #include <iostream> #include "btree.cpp" using namespace std; int main() { char s[] = "ABCDEFG##H####I####JK####################LM"; BTree b = NULL; int i = 0; CreateBTree(b, s, i); cout << "二叉树b的括号表示法为: "; DispBTree(b); cout << endl; cout << "二叉树b的高度为: " << BTHeight(b) << endl; cout << "二叉树b的先序遍历为: "; PreOrder(b); cout << endl; cout << "二叉树b的中序遍历为: "; InOrder(b); cout << endl; cout << "二叉树b的后序遍历为: "; PostOrder(b); cout << endl; cout << "二叉树b的层次遍历为: "; LevelOrder(b); cout << endl; BNode* p = FindNode(b, 'M'); if (p != NULL) cout << "找到了'M'结点" << endl; else cout << "没有找到'M'结点" << endl; p = FindNode(b, 'N'); if (p != NULL) cout << "找到了'N'结点" << endl; else cout << "没有找到'N'结点" << endl; DestroyBTree(b); return 0; } ``` 希望能够帮到你!

相关推荐

NameError: name 'CreateBTree2' is not defined 以下代码:from collections import deque class BTNode: #二叉链中结点类 def init(self,d=None): #构造方法 self.data=d self.lchild=None self.rchild=None class BTree: #二叉树类 def init(self,d=None): #构造方法 self.root=BTNode(d) def DispBTree(self): #返回二叉链的括号表示串 return self._DispBTree1(self.root) def _DispBTree1(self,t): #被DispBTree方法调用 if t==None: return '' else: return '(%s%s%s)' % (t.data,self._DispBTree1(t.lchild),self._DispBTree1(t.rchild)) def FindNode(self,x): #查找值为x的结点算法 return self._FindNode1(self.root,x) def _FindNode1(self,t,x): #被FindNode方法调用 if t==None: return None elif t.data==x: return t else: p=self._FindNode1(t.lchild,x) if p!=None: return p else: return self._FindNode1(t.rchild,x) def Height(self): #求二叉树高度的算法 return self._Height1(self.root) def _Height1(self,t): #被Height方法调用 if t==None: return 0 else: return max(self._Height1(t.lchild),self._Height1(t.rchild))+1 def PreOrder(bt): #先序遍历的递归算法 _PreOrder(bt.root) def _PreOrder(t): #被PreOrder方法调用 if t!=None: print(t.data,end=' ') _PreOrder(t.lchild) _PreOrder(t.rchild) def InOrder(bt): #中序遍历的递归算法 _InOrder(bt.root) def _InOrder(t): #被InOrder方法调用 if t!=None: _InOrder(t.lchild) print(t.data,end=' ') _InOrder(t.rchild) def PostOrder(bt): #后序遍历的递归算法 _PostOrder(bt.root) def _PostOrder(t): #被PostOrder方法调用 if t!=None: _PostOrder(t.lchild) _PostOrder(t.rchild) print(t.data,end=' ') def LevelOrder(bt): #层次遍历的算法 Q=deque() Q.append(bt.root) while len(Q)!=0: t=Q.popleft() print(t.data,end=' ') if t.lchild!=None: Q.append(t.lchild) if t.rchild!=None: Q.append(t.rchild) def CreateBTree2(posts,ins): #由后序序列posts和中序序列ins构造二叉链 n=len(posts) return _CreateBTree2(posts,0,ins,0,n) def _CreateBTree2(posts,i,ins,j,n): #被CreateBTree2方法调用 if n<=0: return None else: r=BTNode(posts[i+n-1]) k=ins.index(posts[i+n-1]) r.lchild=_CreateBTree2(posts,i,ins,j,k-j) r.rchild=_CreateBTree2(posts,i+k-j,ins,k+1,n-(k-j)-1) return r #主程序 ins=[1,2,3,4,5] posts=[5,4,3,2,1] print() print(" 中序:",end=' '); print(ins) print(" 后序:",end=' '); print(posts) print(" 构造二叉树bt") bt=BTree() bt.root=CreateBTree2(posts,len(posts)-1,ins,0,len(ins)) print(" bt:",end=' '); print(bt.DispBTree()) x=值 p=bt.FindNode(x) if p is not None: print(" bt中存在"+x) else: print(" bt中不存在"+x) print(" bt的高度=%d" %(bt.Height())) print(" 先序序列:",end=' '); PreOrder(bt); print() print(" 中序序列:",end=' '); InOrder(bt); print() print(" 后序序列:",end=' '); PostOrder(bt); print() print(" 层次序列:",end=' '); LevelOrder(bt); print()

补全代码:from collections import deque class BTNode: #二叉链中结点类 def init(self,d=None): #构造方法 …… class BTree: #二叉树类 def init(self,d=None): #构造方法 …… def DispBTree(self): #返回二叉链的括号表示串 …… def _DispBTree1(self,t): #被DispBTree方法调用 …… def FindNode(self,x): #查找值为x的结点算法 …… def _FindNode1(self,t,x): #被FindNode方法调用 ……. def Height(self): #求二叉树高度的算法 …… def _Height1(self,t): #被Height方法调用 …… def PreOrder(bt): #先序遍历的递归算法 ……. def _PreOrder(t): #被PreOrder方法调用 …… def InOrder(bt): #中序遍历的递归算法 …… def _InOrder(t): #被InOrder方法调用 …… def PostOrder(bt): #后序遍历的递归算法 …… def _PostOrder(t): #被PostOrder方法调用 …… def LevelOrder(bt): #层次遍历的算法 …… def CreateBTree2(posts,ins): #由后序序列posts和中序序列ins构造二叉链 …… def _CreateBTree2(posts,i,ins,j,n): #被CreateBTree2方法调用 …… #主程序 ins=[……] posts=[……] print() print(" 中序:",end=' '); print(ins) print(" 后序:",end=' '); print(posts) print(" 构造二叉树bt") bt= ___ ___ ___ ___ bt= ___ ___ ___ ___ print(" bt:",end=' '); print(bt.DispBTree()) x= ___ ___ ___ ___ p=bt.FindNode(x) if p!=None: print(" bt中存在"+x) else: print(" bt中不存在"+x) print(" bt的高度=%d" %(bt.Height())) print(" 先序序列:",end=' '); _ ___ ___ ___;print() print(" 中序序列:",end=' '); _ ___ ___ ___;print() print(" 后序序列:",end=' '); _ ___ ___ ___;print() print(" 层次序列:",end=' '); _ ___ ___ ___;print()

from collections import deque class BTNode: #二叉链中结点类 def init(self,d=None): #构造方法 …… class BTree: #二叉树类 def init(self,d=None): #构造方法 …… def DispBTree(self): #返回二叉链的括号表示串 …… def _DispBTree1(self,t): #被DispBTree方法调用 …… def FindNode(self,x): #查找值为x的结点算法 …… def _FindNode1(self,t,x): #被FindNode方法调用 ……. def Height(self): #求二叉树高度的算法 …… def _Height1(self,t): #被Height方法调用 …… def PreOrder(bt): #先序遍历的递归算法 ……. def _PreOrder(t): #被PreOrder方法调用 …… def InOrder(bt): #中序遍历的递归算法 …… def _InOrder(t): #被InOrder方法调用 …… def PostOrder(bt): #后序遍历的递归算法 …… def _PostOrder(t): #被PostOrder方法调用 …… def LevelOrder(bt): #层次遍历的算法 …… def CreateBTree2(posts,ins): #由后序序列posts和中序序列ins构造二叉链 …… def _CreateBTree2(posts,i,ins,j,n): #被CreateBTree2方法调用 …… #主程序 ins=[……] posts=[……] print() print(" 中序:",end=' '); print(ins) print(" 后序:",end=' '); print(posts) print(" 构造二叉树bt") bt= ___ ___ ___ ___ bt= ___ ___ ___ ___ print(" bt:",end=' '); print(bt.DispBTree()) x= ___ ___ ___ ___ p=bt.FindNode(x) if p!=None: print(" bt中存在"+x) else: print(" bt中不存在"+x) print(" bt的高度=%d" %(bt.Height())) print(" 先序序列:",end=' '); _ ___ ___ ___;print() print(" 中序序列:",end=' '); _ ___ ___ ___;print() print(" 后序序列:",end=' '); _ ___ ___ ___;print() print(" 层次序列:",end=' '); _ ___ ___ ___;print()

最新推荐

recommend-type

node-v18.11.0-headers.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

JavaScript_跨平台3D场景编辑器基于threejs golang和mongodb桌面和web.zip

JavaScript
recommend-type

JavaScript_如何编写跨平台Nodejs代码.zip

JavaScript
recommend-type

北邮大三物流工程物流信息系统课程设计

北邮大三物流工程物流信息系统课程设计
recommend-type

0520_1.mov

0520_1.mov
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。