要赶快些,要不然我们寝室就要断电了!
好了,经过四天的艰苦奋斗,我终于完成了一个比较强大的东西了。是什么东西呢?不是什么软件,不是什么程序,而是我自定义的一个数据结构!这个数据结构是二叉树。这个二叉树课不简单,因为它可以进行先序建立、层序建立,并且能够支持先序、中序、后序、层序的遍历。这个数据结构是我这四天来最有成果的一个了。因此我花费了超过24小时。想想自己在上课、吃饭、睡觉、上厕所都在想这个数据结构。能够有这个东西的横空出世,对我来说可真是可喜可贺啊。
今天晚上一直在研究层序创建二叉树的问题。昨天研究的是层序遍历二叉树的问题,因此我自己创建了一个链式队列(详见http://student.csdn.net/space.php?uid=999749&do=blog&id=48348)。有了这个队列,我就可以顺利地使用队列来进行层序遍历了。层序遍历的基本思想是:首先把根节点压入队尾,然后判断是否队列为空。如果为空,则退出循环。(当然没有出队的元素队伍是不会为空的)随后在循环体内进行出队操作,然后调用目标函数,再对左右孩子进行插入队尾的操作。如此循环,知道队列为空为之。这样的效果还真的不错。有了队列这个数据结构,我只需要几条语句就可以搞定层序遍历。
但是层序建立二叉树就没有那么简单了。其原因比较复杂,不好言传。但是今天晚上在我的努力下终于完成了。下面就是我为了编写这个功能而写的伪代码:
-
若根为空,则创建根节点。
- 将根节点进队,
- 如果队未空,则进入循环:
- {
- 删除队首元素,并取出来,
- 填充队首元素,
- 若左孩子满足条件,则创建左孩子,并且进队,
- 若右孩子满足条件,则创建右孩子,并且进队,
- }
说得简单,但是实现起来可是非常的困难的。我一遍又一遍地调试程序,到了现在,这个程序终于成功了。下面是我这个庞大二叉树的代码:
-
⑤在建立二叉树的时候,必须设置导入数据,不然会出错。// 更新于11月13日
-
#ifndef_JBITREE_H_
-
#define_JBITREE_H_
-
#include"JChainQueue.h"
-
-
template<typenameCustomType>
-
structJBiTreeNode
- {
- JBiTreeNode():lchild(0),rchild(0){}
- CustomTypeelem;
- JBiTreeNode*lchild,*rchild;
-
};
-
-
template<typenameCustomType>
-
classJBiTree
- {
-
public:
-
JBiTree():root(0),importData(0),startData(0),nodeCount(0){}
-
~JBiTree(){}
-
voidSetImportData(CustomType*importObj,intsizeofObj,CustomTypedefaultObj);
-
JBiTreeNode<CustomType>*GetRoot(void);
-
boolCreateJBiTreeByPreOrder(JBiTreeNode<CustomType>*current);
-
boolCreateJBiTreeByLevelOrder(JBiTreeNode<CustomType>*current);
-
voidPreOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee));
-
voidInOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee));
-
voidPostOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee));
-
voidLevelOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee));
-
private:
- JBiTreeNode<CustomType>*root;
- CustomType*importData,*startData;
- CustomTypedefaultData;
-
intnodeCount;
- };
-
-
template<typenameCustomType>
-
voidJBiTree<CustomType>::SetImportData(CustomTypeimportObj[],intsizeofObj,CustomTypedefaultObj)
- {
- startData=importData=importObj;
-
nodeCount=sizeofObj/sizeof(CustomType);
- defaultData=defaultObj;
- }
-
-
template<typenameCustomType>
-
JBiTreeNode<CustomType>*JBiTree<CustomType>::GetRoot(void)
- {
-
returnroot;
- }
-
-
template<typenameCustomType>
-
boolJBiTree<CustomType>::CreateJBiTreeByLevelOrder(JBiTreeNode<CustomType>*current)
- {
- JChainQueue<JBiTreeNode<CustomType>*>temp;
-
CustomType*dataTraverse=importData+1;
-
if(importData==startData+nodeCount||*importData==defaultData)
-
returnfalse;
-
if(current==root)
- {
-
root=newJBiTreeNode<CustomType>;
- current=root;
-
}elsereturnfalse;
- temp.EnterQueue(current);
-
while(!temp.IsEmpty())
- {
- current=temp.DeleteQueue();
-
while(*importData==defaultData)
- importData++;
- current->elem=*importData;
- importData++;
-
if(dataTraverse!=startData+nodeCount)
- {
-
if(*dataTraverse!=defaultData)
-
temp.EnterQueue(current->lchild=newJBiTreeNode<CustomType>);
- dataTraverse++;
- }
-
if(dataTraverse!=startData+nodeCount)
- {
-
if(*dataTraverse!=defaultData)
-
temp.EnterQueue(current->rchild=newJBiTreeNode<CustomType>);
- dataTraverse++;
- }
- }
-
returntrue;
- }
-
-
template<typenameCustomType>
-
voidJBiTree<CustomType>::PreOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee))
- {
-
if(current)
- {
- (*Visit)(current->elem);
- PreOrderTraverse(current->lchild,Visit);
- PreOrderTraverse(current->rchild,Visit);
- }
- }
-
-
template<typenameCustomType>
-
voidJBiTree<CustomType>::InOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee))
- {
-
if(current)
- {
- InOrderTraverse(current->lchild,Visit);
- (*Visit)(current->elem);
- InOrderTraverse(current->rchild,Visit);
- }
- }
-
-
template<typenameCustomType>
-
voidJBiTree<CustomType>::PostOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee))
- {
-
if(current)
- {
- PostOrderTraverse(current->lchild,Visit);
- PostOrderTraverse(current->rchild,Visit);
- (*Visit)(current->elem);
- }
- }
-
-
template<typenameCustomType>
-
voidJBiTree<CustomType>::LevelOrderTraverse(JBiTreeNode<CustomType>*current,bool(*Visit)(CustomTypee))
- {
- JChainQueue<JBiTreeNode<CustomType>*>temp;
-
if(current==0)return;
-
temp.EnterQueue(current);
-
while(!temp.IsEmpty())
- {
- current=temp.DeleteQueue();
- (*Visit)(current->elem);
-
if(current->lchild)temp.EnterQueue(current->lchild);
-
if(current->rchild)temp.EnterQueue(current->rchild);
- }
- }
-
-
template<typenameCustomType>
-
boolJBiTree<CustomType>::CreateJBiTreeByPreOrder(JBiTreeNode<CustomType>*current)
- {
-
if(importData==startData+nodeCount||*importData==defaultData)
-
returnfalse;
-
if(current==root)
- {
-
root=newJBiTreeNode<CustomType>;
- current=root;
- }
- current->elem=*importData;
- importData++;
-
if(importData!=startData+nodeCount)
- {
-
if(*importData!=defaultData)
- {
-
current->lchild=newJBiTreeNode<CustomType>;
- CreateJBiTreeByPreOrder(current->lchild);
- }
-
elseimportData++;
- }
-
if(importData!=startData+nodeCount)
- {
-
if(*importData!=defaultData)
- {
-
current->rchild=newJBiTreeNode<CustomType>;
- CreateJBiTreeByPreOrder(current->rchild);
- }
-
elseimportData++;
- }
-
returntrue;
- }
-
#endif
下面是我随便使用一个实例进行调用:
- #include<iostream>
-
#include"JBiTree.h"
-
usingnamespacestd;
-
boolDisplay(chare)
- {
- cout<<e;
-
returntrue;
- }
-
intmain(intargc,char**argv)
- {
-
JBiTree<char>jbtr;
-
chardis[]="124___3579____68AC__D__B___";
-
-
-
jbtr.SetImportData(dis,sizeof(dis)-1,'_');
-
- jbtr.CreateJBiTreeByPreOrder(jbtr.GetRoot());
- jbtr.LevelOrderTraverse(jbtr.GetRoot(),Display);
-
return0;
- }
二叉树很有用。因为在游戏开发中有些图像的索引是BSP树,而BSP树就是二叉树的一种。这次写的二叉树不仅仅是加深对二叉树的理解,而且是对我后续游戏的开发也是非常有帮助的。我希望自己强大的二叉树能够派上用场。
今天没有什么时间了,而且这个二叉树的模型还有诸多潜在的错误。希望大家能够将我的代码下载出来,并进行测试。并将错误反馈给我。我对大家的工作表示无尽的感谢。
更新于11月13日:大家难道没有发现吗?我的二叉树缺少了一个最重要的东西。销毁二叉树!如果不销毁的话,那么就会造成内存泄露这个重大的错误!这个东西我怎么会忘记呢!没办法,还是先这样吧。以后等我维护的时候再添加这个功能吧。现在先打记一下。
分享到:
相关推荐
二叉树的层序、先序、中序、后序遍历。层序采用队列实现,先序、中序、后序采用递归的方式。
这段代码演示了递归和迭代方式实现二叉树的前序、中序和后序遍历。你可以根据需要,选择合适的方法进行二叉树的遍历 二叉树遍历是指按照一定的顺序访问二叉树中的所有节点。常见的二叉树遍历方式有三种:前序遍历、...
建立二叉树,层序、先序、中序、后序遍历二叉树。 基本操作: (1)输入树的各个结点,并能够输出用不同方法遍历的遍历序列; (2)分别建立建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先
程序运行后直接输入节点以0结束后可输出二叉树的4种遍历,然后再通过输入前序中序遍历确定后序层序遍历。
本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作。分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历 输出:后续遍历 思想: 先序遍历中,第一个元素...
4. 掌握二叉树的先序中序后序层序非递归遍历; 5.编制程序实现二叉树遍历算法并运行。 正文 二、综合训练任务描述 这次实习的主要任务是对二叉树的先序、中序、后序的递归与非递归遍历算法,按层次遍历的非递归遍历...
运行时从键盘输入先序序列,创建对应二叉树T,然后对T进行非递归中序遍历、递归后序遍历和层序遍历。
先序,后序,中序,层序遍历二叉树,并且通过出栈入栈的方式的交换所有结点左右子树并层序输出。
二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)1. 二叉树的前序遍历1.1 题目描述1.2 题目分析1.3 Python实现2. 二叉树的中序遍历2.1 题目描述2.2 题目分析2.3 Python实现3. 二叉树的后序遍历2.1 题目...
一,需求分析 1,首先运用递归方法建立一棵链表存储二叉树; 2,以先序次序输入二叉树中节点的值(一个字符); 3,采用二叉树的链表存储结构,借助堆栈建立...3)先序,中序,后序和层序遍历二叉树;
C语言数据结构的高级应用,帮助我们跟好了解数据的应用
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立)【测试数据】如输入:ABC##DE#G##F###(其中#表示空格字符)则输出结果为 先序:ABCDEGF中序:CBEGDFA后序:CGEFDBA层序:ABCDEFG【选...
共包含以下18个: 1.建立二叉树 2.树形输出 3.广义表形输出 4.判断是否为空树 5.求树的深度 6.插入孩子结点 7.删除孩子结点 8.取出根结点 ...17.层序遍历 18.销毁树 按树形输出是自己想的算法,供参考。
数据结构课程设计--二叉树遍历及其应用、对树的先序遍历、后序遍历、中序遍历、层序遍历、二叉树的深度及其叶子树、并打印树形。
先序遍历中序遍历后序遍历图解
编程实现二叉树的建立,先序、中序、后序、层序遍历(非递归方法),二叉树的高度、交换左右子树,统计叶子节点的数目,判断是否为完全二叉树,用括号的形式输出树等功能。 [基本要求] 程序输出菜单界面,菜单包含8...
先序扩展序列建立二叉树,二叉树的先序,中序,后序遍历的递归与非递归算法,层序遍历,以及求树的深度.
二叉树的创建,递归的先序遍历中序遍历后序遍历,层序 遍历。 非递归(用栈和队列实现)先中后序遍历
本文实例讲述了Python二叉树的遍历操作。分享给大家供大家参考,具体如下: # coding:utf-8 @ encoding: utf-8 @ author: lixiang @ email: lixiang_cn@foxmail.com @ python_version: 2 @ time: 2018/4/11 0:09 @...
二叉树的先序、后序、中序的递归遍历,以及二叉树的先序、中序、后序、层序的非递归遍历,有详细注释