二叉树简单实现(未完成)
发布日期:2021-05-07 10:44:58 浏览次数:23 分类:精选文章

本文共 5324 字,大约阅读时间需要 17 分钟。

二叉树的代码更让人无语,我都不知道是哪儿错了。1.一开始遇到的问题是怎么才能够创建一棵二叉树呢,是按什么顺序输入的呢,问题就在这儿,是怎么输入的呢?先根遍历的序列,中根?后根?都不对,因为都没办法确定结构的,就困在这儿了。后来看了书,是把每个没有孩子的结点都加上孩子,这些孩子都用“#”来表示。序列就确定了。照着书上给的创建二叉树代码抄了一遍(代码附在下边),发现不知道怎么用这个函数,一开始是需要传进一个参数的,但函数内部又是从根节点开始操作的,我就蒙了,最后就改成没参数的了。这样我还是比较容易理解的。虽然确实这树是怎么建的我不知道,但就是递归就建好了,原谅我的无知。2.遍历的三种顺序没啥难度,很快完成,但是查找结点就不好了,我原原本本把书上的代码抄了下来,然而一直提示出错,一直提示,我还在别的地访问,有学霸回答说没什么问题啊,我就再去试试,这个时候居然没事了,问题就这样消失了,也找不回了,略过。3.查找父结点,至今我不知道错误在哪儿,但就是出不来正确查询结果,正在问老师,老师答复之后马上更改。有大神看的话也帮帮忙吧,谢谢。好的,下边是代码 BinTreeNode.h#ifndef BHN#define BHN#include
using 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"); }}
上一篇:剑指offer JZ9 变态跳台阶
下一篇:剑指offer JZ8 跳台阶

发表评论

最新留言

不错!
[***.144.177.141]2025年03月29日 16时52分51秒