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

原创 2015年11月21日 15:55:58
二叉树的代码更让人无语,我都不知道是哪儿错了。

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");
    }
}

相关文章推荐

二叉树的简单实现

  • 2013年12月09日 15:21
  • 5KB
  • 下载

二叉树的C++简单实现

  • 2013年12月09日 14:39
  • 4KB
  • 下载

【编译原理龙书笔记】(二)一个简单的语法制导翻译器(仍未完成)

这篇博客是根据自己学习龙书,因为博主习惯了英语环境,在强行从英语转化为中文的时候难免会有些不自然,请大家谅解。配套的练习题答案可以在 https://github.com/Oh233/Dragon_b...
  • Oh233
  • Oh233
  • 2015年06月12日 22:29
  • 562

二叉树的简单实现

  • 2016年04月13日 09:48
  • 2KB
  • 下载

java简单实现二叉树

  • 2010年10月05日 10:04
  • 1KB
  • 下载

RobotFramework+SeleniumLibrary 安装及简单使用方法使用(未完成)

安装python2.7 https://www.python.org/download/releases/2.7/ python2.7 for win-64下载地址 https://www.pytho...
  • xyh421
  • xyh421
  • 2016年11月25日 14:07
  • 752

简单的声音系统代码,未完成

  • 2010年12月12日 12:08
  • 4KB
  • 下载

二叉树的简单实现(3种遍历)

所谓遍历,即按照某种规律或顺序访问树中的全部节点,且每个节点只访问一次。 在访问节点信息时输出节点中的信息。 标准二叉树包括左、右、根三个部分,则我们可以通过递归的方法来访问输中的信息。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树简单实现(未完成)
举报原因:
原因补充:

(最多只允许输入30个字)