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

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

C++ 简单二叉树实现

c++ 简单二叉树实现 基本的构造,先序、中序、后序遍历功能。#ifndef BINTREE_H #define BINTREE_H#include using namespace std; ty...
  • chenxl929
  • chenxl929
  • 2017年03月30日 17:55
  • 204

二叉树(是未完成)

今天我们来聊聊二叉树。 (性质可以收集起来) (1)在二叉树的第 i 层上至多有 2的(n-1)次方个结点 (2)深度为 k 的二叉树至多有 2的 k 次方-1 个结点 (3)具有 n 个结点的...
  • a168861888m
  • a168861888m
  • 2017年11月23日 08:59
  • 45

简单实现二叉树

简单的实现一个二叉树所需要的基本要求,后续进行其他的更新。二叉树最重要的是递归的思想,在这里我想请你去参考我上一篇的广义表,那个思想比起二叉树来说更加简单一些。#define _CRT_SECURE_...
  • qq_26768741
  • qq_26768741
  • 2016年09月26日 14:10
  • 931

二叉树简单实现

// ChainTree.cpp : Defines the entry point for the console application. // #include "stdafx.h" #inc...
  • singebogo
  • singebogo
  • 2017年10月19日 21:34
  • 33

pb 简单实现OutLook菜单(未完成)

使用PB9开发,里面用到2个自定义对象。 //uv_header_btn.sru $PBExportHeader$uv_header_btn.sru forward global type u...
  • swvincent
  • swvincent
  • 2013年04月03日 09:36
  • 457

二叉树的顺序存储结构的C++实现

本以为二叉树的顺序存储结构实现非常简单,类似于线性表,而在实际操作当中遇到了一些小问题,首先是如何判别树节点是否为空,我采用的方法初始化数组值为-111,新插入的节点覆盖初始值,而没有覆盖初始值的则认...
  • Alex123980
  • Alex123980
  • 2016年06月01日 20:14
  • 2229

安装程序已确定以前安装未完成。应重启系统以便完成进程

请问重新安装QTP程序(功能测试工具)时出错? 安装程序提示“安装程序已确定以前安装未完成。应重启系统以便完成进程。”但重启之后依旧如此。有办法解决吗? 打开注册表编辑器,在HKEY_LOCAL_MA...
  • nadine1
  • nadine1
  • 2009年07月30日 17:37
  • 1539

小明的调查作业(未完成)

题面:小明的老师布置了一份调查作业,小明想在学校中请一些同学一起做一项问卷调查,聪明的小明为了实验的客观性,想利用自己的计算机知识帮助自己。他先用计算机生成了N个1到1000之间的随机整数(0...
  • smqymz1009
  • smqymz1009
  • 2016年10月09日 10:30
  • 468

android5.0应用显示安装未完成问题解决方案

大家升到android5.0以后可能有些应用无法安装,如果使用了百度地图,这边文章或许可以帮到你。 不说废话直接上图。 这是百度地图官网给的解释 意思就是如果使用的是sdk3.1以前的版...
  • jhjhy123
  • jhjhy123
  • 2015年12月02日 11:21
  • 828

编码&注释的小问题(未完成)

刚刚照着书(Java)用Notepad++把代码敲了一遍,如下:public class FloatTest{ public static void main(String[] args){ ...
  • OKAXINA
  • OKAXINA
  • 2016年03月22日 23:57
  • 435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树简单实现(未完成)
举报原因:
原因补充:

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