
二叉树简单实现(未完成)
发布日期:2021-05-07 10:44:58
浏览次数:23
分类:精选文章
本文共 5324 字,大约阅读时间需要 17 分钟。
二叉树的代码更让人无语,我都不知道是哪儿错了。1.一开始遇到的问题是怎么才能够创建一棵二叉树呢,是按什么顺序输入的呢,问题就在这儿,是怎么输入的呢?先根遍历的序列,中根?后根?都不对,因为都没办法确定结构的,就困在这儿了。后来看了书,是把每个没有孩子的结点都加上孩子,这些孩子都用“#”来表示。序列就确定了。照着书上给的创建二叉树代码抄了一遍(代码附在下边),发现不知道怎么用这个函数,一开始是需要传进一个参数的,但函数内部又是从根节点开始操作的,我就蒙了,最后就改成没参数的了。这样我还是比较容易理解的。虽然确实这树是怎么建的我不知道,但就是递归就建好了,原谅我的无知。2.遍历的三种顺序没啥难度,很快完成,但是查找结点就不好了,我原原本本把书上的代码抄了下来,然而一直提示出错,一直提示,我还在别的地访问,有学霸回答说没什么问题啊,我就再去试试,这个时候居然没事了,问题就这样消失了,也找不回了,略过。3.查找父结点,至今我不知道错误在哪儿,但就是出不来正确查询结果,正在问老师,老师答复之后马上更改。有大神看的话也帮帮忙吧,谢谢。好的,下边是代码 BinTreeNode.h#ifndef BHN#define BHN#includeusing namespace std;class BinTreeNode {private: BinTreeNode *left, *right; char data;public: BinTreeNode(const char &item, BinTreeNode *lptr = NULL, BinTreeNode *rptr = NULL) : data(item), left(lptr), right(rptr) {} //构造函数 char& GetData() { return data; } //返回数据 **这三条是因为这些是私有的,需要在类中定义函数返回 BinTreeNode *GetLeft(void)const { return left; } //返回左子结点 BinTreeNode *GetRight(void)const { return right; } //返回右子结点 void SetData(const char &item) { data = item; } //设置数据 void SetLeft(BinTreeNode *L) { left = L; } //设置左子结点 void SetRight(BinTreeNode *R) { right = R; } //设置左子结点 };#endif BinTree.h#ifndef BH#define BH#include using namespace std;#include"BinTreeNode.h"class BinTree{private: BinTreeNode *root; //指向根节点指针public: BinTree(BinTreeNode *t=NULL):root(t){} //构造函数 BinTreeNode* CreatBinTree(); //创建二叉树 void Del(BinTreeNode *t); //删除节点t及其左右子树 virtual ~BinTree() { Del(root); } //析构函数,删除整棵二叉树 //在以结点t为根节点的子树中搜索结点p的父结点 BinTreeNode* Father(BinTreeNode *t, BinTreeNode *p); //在以结点t为根节点的子树中查找data域为item的结点 BinTreeNode* Find(BinTreeNode *t, const char &item)const; void PreOrder(BinTreeNode *t)const; //先根遍历并输出 void InOrder(BinTreeNode *t)const; //中根遍历并输出 void PostOrder(BinTreeNode *t)const; //后根遍历并输出 BinTreeNode* GetRoot() { return root; } void SetRoot(BinTreeNode *t) { root = t; }};#endif BinTree.cpp#include"BinTree.h"BinTreeNode* BinTree::CreatBinTree() { //创建二叉树 char ch; cin >> ch; BinTreeNode *t; if (ch == '#') {return NULL;} else { t = new BinTreeNode(ch); } t->SetLeft(CreatBinTree()); t->SetRight(CreatBinTree());}BinTreeNode* BinTree::Father(BinTreeNode *t, BinTreeNode *p) { //寻找父结点 BinTreeNode *q; if (t == NULL || p == NULL)return NULL; //若t为p的父结点,则返回t if (t->GetLeft()==p||t->GetRight()==p)return t; //否则分别在t的左右子树寻找 if ((q=Father(t->GetLeft(),p))!=NULL) return q; else return Father(t->GetRight(),p);}BinTreeNode* BinTree::Find(BinTreeNode *t, const char &item)const { //查找指定数据域 BinTreeNode *p, *q; if (t == NULL) return NULL; if (t->GetData() == item) return t; if ((p = Find(t->GetLeft(), item)) != NULL)return p; else return q = Find(t->GetRight(),item);}void BinTree::PreOrder(BinTreeNode *t)const { //先根遍历并输出 if (t != NULL) { cout << t->GetData() << endl; PreOrder(t->GetLeft()); PreOrder(t->GetRight()); }} void BinTree::InOrder(BinTreeNode *t)const { //中根遍历并输出 if (t != NULL) { InOrder(t->GetLeft()); cout << t->GetData() << endl; InOrder(t->GetRight()); }}void BinTree::PostOrder(BinTreeNode *t)const { //后根遍历并输出 if (t != NULL) { PostOrder(t->GetLeft()); PostOrder(t->GetRight()); cout << t->GetData() << endl; }}void BinTree::Del(BinTreeNode *t) { //删除节点t及其左右子树 if (t != NULL) { Del(t->GetLeft()); Del(t->GetRight()); delete t; }} main.cpp#include"BinTree.h"void main(){ BinTree aTree; while (1) { cout << endl; cout << "请选择" << endl; cout << "1.先序创建二叉树(子树为空以‘#’代替)" << endl; cout << "2.先序遍历输出" << endl; cout << "3.中序遍历输出" << endl; cout << "4.后序遍历输出" << endl; cout << "5.搜索给定结点的父结点,暂时不会" << endl; cout << "6.搜索给定数据结点" << endl; cout << "7.退出" << endl; int i; cin >> i; if (i == 1) { cout << "请按先根遍历顺序输入数据(子树为空以‘#’代替):" << endl; aTree.SetRoot(aTree.CreatBinTree()); //这儿不是aTree.CreatBinTree();这样写跟根没有联系 cout << "二叉树已创建!"<< endl; cout << "根结点为:"<<(aTree.GetRoot())->GetData() << endl; } else if (i == 2) { cout << "先序遍历:" << endl; aTree.PreOrder(aTree.GetRoot()); } else if (i == 3) { cout << "中序遍历:" << endl; aTree.InOrder(aTree.GetRoot()); } else if (i == 4) { cout << "后序遍历:" << endl; aTree.PostOrder(aTree.GetRoot()); } else if (i == 5) { //总是输出未找到,此功能失败 cout << "请输入结点数据:" << endl; char ch; cin >> ch; BinTreeNode *p = new BinTreeNode(ch); BinTreeNode *n; n=aTree.Father(aTree.GetRoot(),p); if (n!= NULL) { cout << ch << "的父结点为:"<GetData() << endl; } else cout << "未找到!"<< endl; } else if (i == 6) { //之前输入不存在结点就会出错,现在居然自己好了,我什么都没干! cout << "请输入要查找的结点数据:" << endl; char ch; cin >> ch; BinTreeNode *m; m=aTree.Find(aTree.GetRoot(), ch); if (m!=NULL){ cout << "已找到:" << m->GetData() << endl; } else cout << "未找到!" << endl; } else break; system("pause"); system("cls"); }}
发表评论
最新留言
不错!
[***.144.177.141]2025年03月29日 16时52分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
springboot入门(1)---整合MyBatis
2019-03-04
Vue入门学习笔记(1)
2019-03-04
趣谈win10常用快捷键
2019-03-04
数学建模(NO.18灰色预测)
2019-03-04
数学建模更新12(数学线性规划模型1)
2019-03-04
Android,SharedPreferences的使用
2019-03-04
JPEG压缩技术
2019-03-04
两款用于检测内存泄漏的软件
2019-03-04
王爽 《汇编语言》 读书笔记 三 寄存器(内存访问)
2019-03-04
准确率94%!Python 机器学习识别微博或推特机器人
2019-03-05
Android基本知识
2019-03-05
在Java中,return null 是否安全, 为什么?
2019-03-05
命令模式【Command Pattern】
2019-03-05
OSI 7 层网络模型
2019-03-05
JDK 内置的多线程协作工具类的使用场景
2019-03-05
Java 中哪些对象可以获取类对象
2019-03-05
linux 的 cp 命令如何复制不提示覆盖
2019-03-05