二叉树简单实现(未完成)

二叉树的代码更让人无语,我都不知道是哪儿错了。

1.
一开始遇到的问题是怎么才能够创建一棵二叉树呢,是按什么顺序输入的呢,问题就在这儿,是怎么输入的呢?先根遍历的序列,中根?后根?都不对,因为都没办法确定结构的,就困在这儿了。
后来看了书,是把每个没有孩子的结点都加上孩子,这些孩子都用“#”来表示。
序列就确定了。
照着书上给的创建二叉树代码抄了一遍(代码附在下边),发现不知道怎么用这个函数,一开始是需要传进一个参数的,但函数内部又是从根节点开始操作的,我就蒙了,最后就改成没参数的了。这样我还是比较容易理解的。虽然确实这树是怎么建的我不知道,但就是递归就建好了,原谅我的无知。

2.
遍历的三种顺序没啥难度,很快完成,但是查找结点就不好了,我原原本本把书上的代码抄了下来,然而一直提示出错,一直提示,我还在别的地访问,有学霸回答说没什么问题啊,我就再去试试,这个时候居然没事了,问题就这样消失了,也找不回了,略过。

3.
查找父结点,至今我不知道错误在哪儿,但就是出不来正确查询结果,正在问老师,老师答复之后马上更改。有大神看的话也帮帮忙吧,谢谢。

好的,下边是代码


BinTreeNode.h

#ifndef BHN
#define BHN
#include<iostream>
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<iostream>
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;
	}
}  

</pre><pre name="code" class="cpp">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;<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>
        }
        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 << "的父结点为:"<<n->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");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值