分类二叉树的相关算法

分类二叉树的相关算法
分类二叉树的相关算法

数据结构《实验4》实验报告

实验项目4:分类二叉树的构建

回答问题完整、实验结果(运行结果界面及源程序,运行结果界面放在前面):

#define STUDENT EType

#include

#include

#include

#include

#include

//二叉树链式结构定义

struct STUDENT

{

char name[10];

char number[12];

char place[10];

char sex[3];

int age;

};

struct BinaryTreeNode

{

EType data;

BinaryTreeNode *LChild;

BinaryTreeNode *RChild;

};

typedef BinaryTreeNode BinaryTree; //堆栈结构定义

struct SType

{

BinaryTreeNode *ptr;

bool status;

};

struct Stack

{

SType *element;

int top;

int Maxsize;

};

struct Node_Ptr

{

BinaryTreeNode *ptr;

} ;

void DigitalToString(char str[],int n)

{

char temp;

char k=1;

int i=0;

while (n && i<80)

{

k=n%10+48;

n=n/10;

str[i]=k;

i++;

}

str[i]='\0';

int len=strlen(str);

for (i=0;i

{

temp=str[i];

str[i]=str[len-i-1];

str[len-i-1]=temp;

}

}

void CreatStack(Stack &S,int MaxStackSize) {//构造一个最大容量为MaxStackSize的堆栈S.Maxsize=MaxStackSize;

S.element=new SType[S.Maxsize];

S.top=-1;

}

bool IsEmpty(Stack &S)

{//判断堆栈是否为空

if(S.top==-1)return true;

return false;

}

bool IsFull(Stack &S)

{//判断堆栈是否为满

if(S.top>= S.Maxsize-1)

return true;

else

return false;

}

bool GetTop(Stack &S,SType &result)

{//返回堆栈S中栈顶元素

if(IsEmpty(S))return false;

result=S.element[S.top];

return true;

}

bool Pop(Stack &S,SType &result)

{//将S栈顶的值取至result中,返回出栈后的状态

if(IsEmpty(S))return false;

result.ptr=S.element[S.top].ptr;

result.status=S.element[S.top].status;

S.top--;

return true;

}

bool Push(Stack &S,SType &result)

{//result进s栈,返回进栈后的状态值

if(IsFull(S))return false;

S.top++;

S.element[S.top]=result;

//S.element[S.top].status=result.status;

return true;

}

//构造一棵二叉树

BinaryTree * MakeNode(EType &x)

{//构造节点

BinaryTree *ptr;

ptr=new BinaryTreeNode;

if(!ptr) return NULL;

ptr->data=x;

ptr->LChild=NULL;

ptr->RChild=NULL;

return ptr;

}

void MakeBinaryTree(BinaryTree *root,BinaryTree *left,BinaryTree *right)

{//链接root,left,right所指的节点指针为二叉树

root->LChild=left;

root->RChild=right;

}

void BinaryDelete(BinaryTree *BT)

{//二叉树的删除

if(BT)

{

BinaryDelete(BT->LChild);

BinaryDelete(BT->RChild);

delete BT;

}

}

char *GetOuputInformationString(int WidthOfData, char *OutputInformation, char

*outputstring)

{//将一个元素的字符串OutputInformation转换为宽度为WidthOfData的等长字符串outputstring

//例如,姓名是由四个字符组成,而WidthOfData为8,则在姓名字符串的两边分别连接两个字符,形成8个长度的字符串

int left_space,right_space;

int i;

char left_space_string[16]={""};

char right_space_string[16]={""};

int add_space;

int len_OutputInformation=strlen(OutputInformation); //计算OutputInformation的字符个数

add_space=WidthOfData - len_OutputInformation; //计算需要补充的字符个数

left_space=add_space/2; //计算OutputInformation左边需要补充的字符个数

right_space=add_space-left_space; //计算OutputInformation右边需要补充的字符个数

for(i=1;i<=left_space;i++) //形成OutputInformation左边需要补充的空格字符串

strcat(left_space_string," ");

for(i=1;i<=right_space;i++) //形成OutputInformation右边需要补充的空格字符串

strcat(right_space_string," ");

//在OutputInformation左边和右边连接需要补充的空格字符串

strcpy(outputstring,left_space_string);

strcat(outputstring,OutputInformation);

strcat(outputstring,right_space_string);

return outputstring; //返回WidthOfData宽度的outputstring

}

char *GetOuputInformation(int item, int k, char *outputInformation, Node_Ptr

*element)

{

switch(item)

{

/*case 1: //线索树特有的处理与一般二叉树不同之处,在姓名的两边连接线索标志

{

if(element[k].ptr->Lflag)

strcpy(outputInformation,"1");

else

strcpy(outputInformation,"0");

strcat(outputInformation,element[k].ptr->https://www.360docs.net/doc/bf6793390.html,);

if(element[k].ptr->Rflag)

strcat(outputInformation,"1");

else

strcat(outputInformation,"0");

break;

}*/

case 1:

{

strcat(outputInformation,element[k].ptr->data.number);

break;

}

case 2:

{

strcat(outputInformation,element[k].ptr->https://www.360docs.net/doc/bf6793390.html,);

break;

}

case 3:

{

strcat(outputInformation,element[k].ptr->data.sex);

break;

}

case 4:

{

DigitalToString(outputInformation,element[k].ptr->data.age);

break;

}

case 5:

{

strcat(outputInformation,element[k].ptr->data.place);

break;

}

default: break;

}

return outputInformation;

}

void OutputBinaryTree(BinaryTreeNode *BT)

{

Node_Ptr temp,*element;

BinaryTreeNode *p;

int MaxSize;

int BinaryTreeHigh;

int i,j,k;

BinaryTreeHigh=5; //BinaryHeight(BT);

MaxSize=(int) pow(2,BinaryTreeHigh);

element = new Node_Ptr [MaxSize+1]; //定义一个用于存放二叉树结点指针的数组

for (i=1;i<=MaxSize;i++) //对指针数组初始化,初值设为NULL element[i].ptr=NULL;

p = BT;

temp.ptr = p;

if (p) element[1]=temp;

for (i=1;i<=MaxSize;i++) //将二叉树中的每个结点指针以顺序存储结构存放到数组中

{

p=element[i].ptr;

if (p)

{

if (p->LChild)

{

temp.ptr = p->LChild;

element[2*i]=temp;

}

if (p->RChild)

{

temp.ptr = p->RChild;

element[2*i+1]=temp;

}

}

}

int WidthOfData=5;

int IntervalOfData=3;

// cout<<"WidthOfData="<

// cout<<"IntervalOfData="<

// cout<<"BinaryTreeHigh="<

int position_of_central[6][17]; //存放每一元素输出位置中心(距离屏幕左边界的字符数)

int row,col; //二维数组的行列下标变量

for(i=0;i<=BinaryTreeHigh;i++) //存放每一元素输出位置中心(距离屏幕左边界的字符数),初值为0

for(j=0;j<=pow(2,BinaryTreeHigh-1);j++)

position_of_central[i][j]=0;

for(i=1;i<=pow(2,BinaryTreeHigh)-1;i++) //对深度为BinaryTreeHigh的满二叉树的所有结点计算每个结点输出的中心点位置

{

k=i*2; //k指向i的左子树根结点

while (k<=pow(2,BinaryTreeHigh)-1) //k不断推进到i编号的结点左子树中最右子孙结点

k=2*k+1;

k=k/2; //k的值就是i编号的结点左子树中最右子孙结点的编号

j=(int)(k-(pow(2,(BinaryTreeHigh-1))-1)); //由k编号的结点换算出该结点是底层中从左至右第j个结点右上方

//即编号为k的结点中心点垂直线左边最底层上有j个结点

row=(int)(log10(i)/log10(2)+1); //计算中心点值存放在position_of_central[row][col]中的row

col=(int)(i-(pow(2,(row-1))-1)); //计算中心点值存放在

position_of_central[row][col]中的col

if(row==BinaryTreeHigh)

//计算底层i结点距离左边界的字符数,左边无间隙

position_of_central[row][col]= (j-1)*WidthOfData + (j-1)*IntervalOfData + (WidthOfData/2 +1);

else

//计算非底层i结点距离左边界的字符数,

position_of_central[row][col]=j*WidthOfData + (j-1)*IntervalOfData + (IntervalOfData/2 +1);

}

char prespace[100];

int m;

int kk;

int kkk;

int item_max=5;

cout<

for(i=1;i<=BinaryTreeHigh;i++)

{

kkk=(int)pow(2,i-1); //kkk是满二叉树中每一层第1个结点的编号

for(int item=1;item<=item_max;item++) //输出每个数据元素多个item成员的值

{

int half_len_pre_value=0; //同一行前一个输出的元素值长度的一半,同一行第一个输出的元素值前没有值输出,初值为0

int half_len_now_value=WidthOfData/2;//同一行当前输出的元素值长度的一半,其值始终为WidthOfData的一半

kk=kkk; //kk是满二叉树中每一层结点的编号变化,从某层的最左边第一个结点编号kkk开始

for(j=1;j<=pow(2,i-1);j++) //输出满二叉树中同一层次上的每个数据元素的同一个成员的值

{

char outputInformation[20]={""};

char *OutputInformation;

if (element[kk].ptr) //获取每个数据元素的一个成员的值OutputInformation,如姓名、年龄等

OutputInformation=GetOuputInformation(item,kk,outputInformation,element);

if (position_of_central[i][j]) //输出数据中点值存在时,position_of_central[i][j]非0

{

char outputstring[80]={""};

char *OutputString;

//下面语句将每个数据元素的一个成员的值OutputInformation,如姓名、年龄等,转换为等长WidthOfData的字符串OutputString

OutputString=GetOuputInformationString(WidthOfData,OutputInformation,outputstring);

//生成两个孩子之前的空格串prespace

//构成:<前导空格串>=<两个输出数据中心点之差> - <前一个输出元素值长度一半> - <当前输出元素值长度的一半>

strcpy(prespace,"");

m=(position_of_central[i][j]-position_of_central[i][j-1]-1-half_len_pre_value-half_len_now_ value);

for(k=1;k<=m;k++)

strcat(prespace," ");

cout<

cout<

half_len_pre_value=WidthOfData/2; //调整同一行前一个输出的元素值长度为WidthOfData的一半

kk++;

}// if (position_of_central[i][j])

}//for(j=1;j<=pow(2,i-1);j++)

cout<

}//for(int item=1;item<=5;item++)

char line[3]="─";

char OutputLine[80];

char midspace[80];

int nodenumber;

if(i==1) //对深度为BinaryTreeHigh的满二叉树从上至下,从左至右的编号,计算第i层上起始结点的编号nodenumber

nodenumber=1;

else

nodenumber=(int)((pow(2,i)-1)-(pow(2,i-1)-1)); //第i(i!=1)层上的第1个结

点编号nodenumber

for(j=1;j<=pow(2,i-1);j++) //输出同一层次上的线条

{

if(i==BinaryTreeHigh) break; //最底层下面没有线条,所以break

//生成两个数据元素之前的前导空格串prespace

strcpy(prespace,"");

m=(position_of_central[i+1][j]-position_of_central[i+1][j-1]-1);

for(k=1;k<=m;k++)

strcat(prespace," ");

//计算左右两个孩子之间一半的连线OutLine,由若干个line"─"构成

//注意line是汉字字符,一个占两个字符位,m是左右两个孩子之间的line"─"数,所以m要除4

strcpy(OutputLine,"");

m=(position_of_central[i+1][j+1]-position_of_central[i+1][j]-1)/4;

for(k=1;k<=m;k++)

strcat(OutputLine,line);

//计算左右两个孩子之间一半的空格字符的个数m,,所以要除2。由m形成左右两个孩子之间的空格串midspace

strcpy(midspace,"");

m=(position_of_central[i+1][j+1]-position_of_central[i+1][j]-1)/2;

for(k=1;k<=m;k++)

strcat(midspace," ");

if ((element[2*nodenumber].ptr) && (element[2*nodenumber+1].ptr))//左右子树都存在时,左右两个孩子上的连接线┌─┴─┐

cout<

<<"┌"<

if ((element[2*nodenumber].ptr) && (!element[2*nodenumber+1].ptr))//左子树存在,右子树不存在时,左右两个孩子上的连接线┌─┘

cout<

<<"┌"<

if ((!element[2*nodenumber].ptr) && (element[2*nodenumber+1].ptr))//左子树不存在,右子树存在时左右两个孩子上的连接线└─┐

cout<

<

if ((!element[2*nodenumber].ptr) && (!element[2*nodenumber+1].ptr))//左子树不存在,右子树不存在时,没有连接线,是空格串

cout<

<

nodenumber=nodenumber+1; //结点编号加1

}

cout<

}//for(i=1;i<=BinaryTreeHigh;i++)

delete element; //释放工作空间

}

//分类二叉树中序遍历遍历方式

void InOrderNoRecursive(BinaryTree *BT)

{//二叉树的中序遍历非递归算法

Stack S;

SType temp;

BinaryTree *p=BT;//一般约定BT指向一颗二叉树的根节点

int MaxStackSize=50;//其值是假设的一个足够大的数

CreatStack(S,MaxStackSize);//产生一个空栈,这一过程函数可以不在这里进行

cout<<"************** "<

while(p||!IsEmpty(S))

{

while(p)//找最左子树

{

temp.ptr=p;

Push(S,temp);//根节点(未访问)指针进栈,以后回溯时候退栈

p=p->LChild;//指针指向该根节点的左子树

}

if(!IsEmpty(S))//左子树为空时,利用堆栈回溯

{

Pop(S,temp);//从堆栈中弹出回溯节点指针(该节点未访问过)

p=temp.ptr;

cout<<" "<https://www.360docs.net/doc/bf6793390.html,<<" "<data.number<<" "<data.sex<<" "<data.age<<" "<data.place <RChild;//指针指向回溯节点的右子树

}

}

}

bool SortBinaryTreeSearch(BinaryTreeNode *BT,EType &x,int &SearchKey)

{//查找关键字为SearchKey的节点值

BinaryTreeNode *p=BT;

while(p)

{

if(SearchKeydata.age)

p=p->LChild;

else

{

if(SearchKey>p->data.age)

p=p->RChild;

else

{

x=p->data;

return true;

}

}

}

return false;

}

bool SortBinaryTreeInSert(BinaryTreeNode *BT,EType &x)

{//求如果不重复出现,则插入节点x

BinaryTreeNode *p=BT;

BinaryTreeNode *parent=NULL;

while(p)

{

parent=p;

if(x.agedata.age)

p=p->LChild;

else

if(x.age>p->data.age)

p=p->RChild;

else

return false;

}

//找到插入点,为x申请一个空间填入其值,并将该节点连接至parent BinaryTreeNode *q=new BinaryTreeNode;

q->data=x;

q->LChild=NULL;

q->RChild=NULL;

if(BT)

{

if(x.agedata.age)

parent->LChild=q;

else

parent->RChild=q;

}

else

BT=q;

return true;

}

BinaryTreeNode *SortBinaryTreeDelete(BinaryTreeNode *BT,int &SearchKey) {//删除关键字为SearchKey的节点,并返回删除后根节点的指针BinaryTreeNode *p=BT;

BinaryTreeNode *parent=NULL;

BinaryTreeNode *son,*ps;

while(p&&p->data.age!=SearchKey)

{

parent=p;

if(p->data.age>SearchKey)

p=p->LChild;

else

p=p->RChild;

}

if(!p)

{

cout<<"没找到要删除的节点"<

return BT;

}

//对分类二叉树重构

if(p->LChild&&p->RChild)

{

son=p->LChild;

ps=p;

while(son->RChild)

{

ps=son;

son=son->RChild;

}

p->data=son->data;

p=son;

parent=ps;

}

if(p->LChild)

son=p->LChild;

else

son=p->RChild;

if(BT==p)

BT=son;

else

{

if(p==parent->LChild)

parent->LChild=son;

else

parent->RChild=son;

}

delete p;

return BT;

}

void main()

{

BinaryTree *BT;

BinaryTreeNode *p[11];

int choice;

EType result,x;

char number[][8]={" ","101","102","103","104","105","106","107","108"};

char sex [][8]={" ","女","男","男","女","男","女","男","女"};

char name [][8]={" ","小猫","小狗","小鸡","小妞","小孩","小鸟","小白","小花"};

char place[][8]={" ","湖北","湖南","山西","陕西","河北","河南","江西","江苏"};

int age[8]={15,12,23,10,13,21,25,11};

//初始化

for(int i=1;i<9;i++)

{

x.age=age[i-1];

strcpy(https://www.360docs.net/doc/bf6793390.html,,name[i]);

strcpy(x.number,number[i]);

strcpy(x.place,place[i]);

strcpy(x.sex,sex[i]);

p[i]=MakeNode(x);

}

BT=p[1];

//构造二叉树

MakeBinaryTree(p[1],p[2],p[3]);

MakeBinaryTree(p[2],p[4],p[5]);

MakeBinaryTree(p[3],p[6],p[7]);

MakeBinaryTree(p[4],NULL,p[8]);

MakeBinaryTree(p[5],NULL,NULL);

MakeBinaryTree(p[6],NULL,NULL);

MakeBinaryTree(p[7],NULL,NULL);

MakeBinaryTree(p[8],NULL,NULL);

while (true)

{

cout<

cout<<"************************分类二叉树的相关算法************************"<

cout<<"* 1--------分类二叉树的中序遍历算法输出二叉树中的所有元素*"<

cout<<"* 2--------分类二叉树中查找关键字为searchkey的节点值result算法*"<

cout<<"* 3--------将节点插入分类二叉树中*"<

cout<<"* 4--------删除分类二叉树中的节点*"<

cout<<"* 0--------退出*"<

cout<<"******************************************************************** "<

cout<<"请选择处理功能:"; cin>>choice;

cout<

system("cls");

switch(choice)

{

case 1:

{//1---------通过分类二叉树的中序遍历算法输出二叉树中的所有元素

cout<<"二叉树的树形结构:"<

OutputBinaryTree(BT);

cout<<" ##########分类二叉树的中序遍历算法输出二叉树中的所有元素########"<

InOrderNoRecursive(BT);

break;

}

case 2:

{//2---------分类二叉树中查找关键字为searchkey的节点值x算法

cout<<"二叉树的树形结构:"<

OutputBinaryTree(BT);

cout<<" #########分类二叉树中查找关键字为searchkey的节点值result 算法########"<

int searchkey;

cout<<"请输入查找关键字"<

cin>>searchkey;

SortBinaryTreeSearch(BT,result,searchkey);

cout<

break;

}

case 3:

{//3--------将节点插入分类二叉树中

cout<<"二叉树的树形结构:"<

OutputBinaryTree(BT);

cout<<" #########分类二叉树中插入关键字为searchkey的节点值result 算法########"<

//初始化插入关键字为age的节点result

result.age=16;

strcpy(result.number,"109");

strcpy(result.place,"韩国");

strcpy(result.sex,"女");

strcpy(https://www.360docs.net/doc/bf6793390.html,,"容和");

SortBinaryTreeInSert(BT,result);

cout<<"******************插入后树形输出********************"<

OutputBinaryTree(BT);

break;

}

case 4:

{//4---------删除分类二叉树中的节点

cout<<"二叉树的树形结构:"<

OutputBinaryTree(BT);

cout<<" #########分类二叉树中查找关键字为searchkey的节点值result 算法########"<

int searchkey;

cout<<"请输入删除关键字"<

cin>>searchkey;

SortBinaryTreeDelete(BT,searchkey);

cout<<"******************输入后树形输出********************"<

OutputBinaryTree(BT);

break;

}

case 0:

{//0-------退出

cout<<"退出操作"<

BinaryDelete(BT);

// delete BT;

}

}

system("pause");

system("cls");

}

}

二叉树的各种算法

二叉树的各种算法.txt男人的承诺就像80岁老太太的牙齿,很少有真的。你嗜烟成性的时候,只有三种人会高兴,医生你的仇人和卖香烟的。 /*用函数实现如下二叉排序树算法: (1)插入新结点 (2)前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 Input 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 Output 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行~第十三行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十四行~第十六行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十七行:二叉树的深度 第十八行:叶子结点数 */ #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

#define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int KeyType; #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(keydata)return SearchBST(T->lchild,key,T,p); else return(SearchBST(T->rchild,key,T,p)); } Status InsertBST(BiTree &T,ElemType e) { BiTree s,p; if(!SearchBST(T,e,NULL,p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e;s->lchild=s->rchild=NULL; if(!p)T=s; else if(edata)p->lchild=s; else p->rchild=s; return TRUE; } else return FALSE; } Status PrintElement( ElemType e ) { // 输出元素e的值 printf("%d ", e ); return OK; }// PrintElement

二叉树排序算法

实验报告 课程名称:数据结构实验课程 实验四、串的基本操作练习 一、实验目的 1. 掌握二叉树的存储实现 2. 掌握二叉树的遍历思想 3. 掌握二叉树的常见算法的程序实现 二、实验环境 VC++6.0 三、实验内容 1.输入字符序列,建立二叉树的二叉链表结构。(可以采用先序序列) 2.实现二叉树的先序、中序、后序的递归遍历算法。 3.实现二叉树的先序、中序、后序的非递归遍历算法。 4.求二叉树的高度。 5.求二叉树的结点个数。 6.求二叉树的叶子结点的个数。 四、实验要求: 分别编写实现上述算法的子函数,并编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述子函数。 五、实验步骤和结果 1.打开vc,新建文本,命名二叉树算法,编写代码。 2.编写代码: #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int i=0; /*--------------------------------------建立堆栈------------------------------------------*/ typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; } BiTNode,*BiTree;//树类型 typedef struct SqStack {

BiTNode *base; BiTNode *top; int stacksize; } SqStack;//栈类型 void InitStack(SqStack *S)//创建二叉树 { S->base=(BiTNode*)malloc(STACK_INIT_SIZE*sizeof(BiTNode)); S->top=S->base; S->stacksize=STACK_INIT_SIZE; } void Push(SqStack *S,BiTNode e)//进栈 { if(S->top - S->base >= S->stacksize)//如果栈空间不足 { S->base=(BiTNode*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(B iTNode)); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *(S->top)=e; S->top++; } BiTNode Pop(SqStack *S)//出栈 { S->top --; return *S->top; } int StackEmpty(SqStack *S)//判断栈是否非空 { if(S->top == S->base ) return 1; else return 0; } /*---------------------------------------------递归部分-------------------------------------------*/

实验三 二叉树的基本操作实现及其应用

二叉树的基本操作实现及其应用 一、实验目的 1.熟悉二叉树结点的结构和对二叉树的基本操作。 2.掌握对二叉树每一种操作的具体实现。 3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。 4.会用二叉树解决简单的实际问题。 二、实验内容 设计程序实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。 1 按先序次序建立一个二叉树, 2按(A:先序 B:中序 C:后序)遍历输出二叉树的所有结点 以上比做,以下选做 3求二叉树中所有结点数 4求二叉树的深度 三、实验步骤 ㈠、数据结构与核心算法的设计描述 /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct BitNode { DataType data; struct BitNode *lchild,*rchild; }*BitTree; 相关函数声明: 1、/* 初始化二叉树,即把树根指针置空 */ void BinTreeInit(BitTree *BT) { BT=(BitTree)malloc(sizeof(BitNode)); BT->data=NULL; cout<<"二叉树初始化成功!"<>ch; if(ch=='#') BT=NULL; else { if(!(BT=(BitTree)malloc(sizeof(BitNode)))) exit(0);

东北大学计算机初试历年二叉树算法题目及解答

[1996] 设t 为一棵二叉树的根结点地址指针,试设计一个非递归算法完成把二叉树中每个结点的左右孩子位置交换。 int swithLRChild(BiTree *t) { BiTree *stack[100] = {0}; int stack_length = 0; if (NULL == t){ return 0; } stack[stack_length++] = t; while (stack_length > 0){ //pop stack BiTree *node = stack[stack_length - 1]; stack_length -= 1; BiTree *temp = node ->lchild; node->lchild = node ->rchild; node->rchild = temp; if (NULL != node ->rchild){ stack[stack_length++] = node ->rchild;} if (NULL != node ->lchild){ stack[stack_length++] = node ->lchild; } } return 1; } [1998]一棵高度为K 且有n个结点的二叉排序树,同时又是一棵完全二叉树存于向量t 中,试设计删除树中序号为i 且具有左右孩子的一个结点,而不使存储量增加保证仍为二叉排序树(不一定是完全二叉树)的算法。 //存数据的位置是从 1 的索引开始的,避免需要访问索引为0 的空间,避免需要频繁的索引 转换 void delNodeInSortedBiTree(int *sorted_bitree, int *last_index,int i) { //因为题目中描述具有左右孩子,所以直接从左孩子的最右边叶子节点开始//分两种情况,左孩子没有右孩子,那么左孩子之后的节点都移动一个位子//左孩子存在右孩子,则从右孩子的左孩子一直走,到叶子节点停止,因为是叶子节点//就不需要移动元素了 int del_node_index = 2*i; if (2*del_node_index + 1 >= *last_index)

二叉树遍历算法的实现

二叉树遍历算法的实现 题目:编制二叉树遍历算法的实现的程序 一.需求分析 1.本演示程序中,二叉树的数据元素定义为非负的整型(unsigned int)数据,输 入-1表示该处没有节点 2.本演示程序输入二叉树数据均是按先序顺序依次输入 3.演示程序以用户和计算机对话方式执行,即在计算机终端上显示“提示信息” 之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运 算结果显示在其后 4.本实验一共包括三个主要程序,分别是:1)二叉树前序,中序,后序遍历递归 算法实现2)二叉树前序中序遍历非递归算法实现3)二叉树层次遍历算法实现 5.本程序执行命令包括:1)构建二叉树2)二叉树前序递归遍历3)二叉树中序 递归遍历4)二叉树后序递归遍历5)二叉树前序非递归遍历6)二叉树中序非 递归遍历7)二叉树层次遍历 6.测试数据 (1)7 8 -1 9 10 -1 -1 -1 6 11 -1 -1 12 13 -1 -1 14 -1 -1 (2)1 -1 -1 (3)7 8 -1 -1 9 -1 -1 二.概要设计 1.为实现二叉树的遍历算法,我们首先给出如下抽象数据类型 1)二叉树的抽象数据类型 ADT BiTree{ 数据对象D:D是具有相同特性的数据元素的集合 数据关系R: 若D=Φ,则R=Φ,称BiTree是空二叉树; 若D≠Φ,则R={H},H是如下二元关系: (1)在D中存在唯一的成为根的数据元素root,它在关系H下无前驱; (2)若D-{H}≠Φ,则存在D-{root}={D1,D r},且D1∩D r=Φ (3)若D1≠Φ,则D1中存在唯一的元素x1,∈H,且存在D1上的 关系H1?H;若Dτ≠Φ,则D r中存在唯一的元素x r,∈ H,且存在D r上的关系H r?H;H={,,H1,H r}; (4)(D1,{H1})是符合本定义的二叉树,成为根的左子树,(D r,{H r})是 一颗符合本定义的二叉树,成为根的右字树。 基本操作P: InitBiTree(&T); 操作结果:构造空二叉树 DestroyBiTree(&T) 初始条件;二叉树存在 操作结果:销毁二叉树 CreateBiTree(&T,definition);

设计一个完整的程序,实现二叉树的各种算法

实验6 实验目的: 1、掌握二叉树的所有算法 2、熟悉计算机英语和术语 实验步骤: 1、二叉树算法的模拟 2、完型填空 3、翻译 具体要求: 一、设计一个完整的程序,实现二叉树的各种算法 要求:/*用函数实现如下二叉排序树算法: (1)插入新结点 (2)前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 输入: 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 输出: 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 代码: #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int KeyType;

#define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(keydata)return SearchBST(T->lchild,key,T,p); else return(SearchBST(T->rchild,key,T,p)); } Status InsertBST(BiTree &T,ElemType e) { BiTree s,p; if(!SearchBST(T,e,NULL,p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e;s->lchild=s->rchild=NULL; if(!p)T=s; else if(edata)p->lchild=s; else p->rchild=s; return TRUE; } else return FALSE; } Status PrintElement( ElemType e ) { // 输出元素e的值 printf("%d ", e ); return OK; }// PrintElement Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) { // 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。 //补全代码,可用多个语句

二叉树删除算法

二叉树删除算法 姓名:李晓娜学号:20122593 班级:软件一班 1、问题描述 使用算法实现二叉树的建立及删除。 2、解题思路 二叉树的删除操作比较复杂,主要分三种情况:1、删除没有子节点的节点,2、删除只有一个节点的节点(其中有分为两种情况),3、删除有两个节点的节点。 首先看第一种情况:(删除没有子节点的节点) 删除没有子节点的节点只需要将被删除节点的父节点指向空即可 第二种情况:(删除只有一个子节点的节点) 删除有一个子节点的节点,只需要将被删除节点的父节点指向删除节点的子节点即可

第三种情况:(删除有两个子节点的节点,即左右子树都非空) 删除有两个子节点的节点,到底谁来替代被删除的节点的位置呢?是左节点,还是右节点,代替以后这个子节点的子节点应该怎么安排?一系列的问题都出来了。。。简便的方法就是要找一个节点代替这个被删除的节点,这就要从二叉搜索树的定义来看。因为二叉搜索树是有序的,我们要找的节点在这棵树上,而且这个节点要比被删除的左节点大,比右节点小。先看看这个已被删除节点的右节点为根的子树的所有节点的值都要比被删除节点大,这是二叉搜索树定义的,但是要在这个集合中找到最小的一个,来代替被删除的节点,那就要在这棵子树上一直往左找。这个节点比被删除的节点的右节点小,且比左节点大,那这个节点就叫做被删除节点的后继节点,用这个节点来代替被删除节点。

3、实验代码 #include #include typedef int InfoType; typedef int KeyType; //假定关键字类型为整数 typedef struct node //结点类型 { KeyType key; //关键字项 InfoType otherinfo; //其它数据域,InfoType视应用情况而定下面不处理它struct node *lchild,*rchild;//左右孩子指针 }BSTNode; typedef BSTNode *BSTree; //BSTree是二叉排序树的类型 void main() { void InsertBST(BSTree *Tptr,KeyType key); BSTree CreateBST(void); void DelBSTNode(BSTree *Tptr,KeyType key); void ListBinTree(BSTree T); //用广义表表示二叉树 BSTree T; int key; printf("请输入关键字(输入0为结束标志):\n"); T=CreateBST(); ListBinTree(T); printf("\n"); printf("请输入欲删除关键字:"); scanf("%d",&key); DelBSTNode(&T,key); ListBinTree(T);

二叉树的遍历算法实验报告

二叉树实验报告 09信管石旭琳 20091004418 一、实验目的: 1、理解二叉树的遍历算法及应用 2、理解哈夫曼树及其应用。 3、掌握哈夫曼编码思想。 二、实验内容: 1、建立二叉树二叉链表 2、实现二叉树递归遍历算法(中序、前序、后序) 3、求二叉树高度 4、求二叉树结点个数 5、求二叉树叶子个数 6、将序号为偶数的值赋给左子树 三、主要程序: #include #include typedef int ElemType; struct BiTNode { ElemType data; struct BiTNode *lch,*rch; }BiTNode,*BiTree; struct BiTNode *creat_bt1(); struct BiTNode *creat_bt2(); void preorder (struct BiTNode *t); void inorder (struct BiTNode *t); void postorder (struct BiTNode *t); void numbt (struct BiTNode *t); int n,n0,n1,n2; void main() { int k; printf("\n\n\n"); printf("\n\n 1.建立二叉树方法1(借助一维数组建立)"); printf("\n\n 2.建立二叉树方法2(先序递归遍历建立)"); printf("\n\n 3.先序递归遍历二叉树"); printf("\n\n 4.中序递归遍历二叉树"); printf("\n\n 5.后序递归遍历二叉树"); printf("\n\n 6.计算二叉树结点个数"); printf("\n\n 7.结束程序运行");

二叉树的各种遍历算法及其深度算法

二叉树的算法: 用扩展先序遍历序列创建二叉树; 递归遍历算法 中序非递归遍历层次遍历 二叉树深度的算法 实现代码如下: #include #include #include typedef struct Node { char data; struct Node *LChild; struct Node *RChild; }BitNode,*BitTree; typedef struct CSNode { char data; struct CSNode *fch, *nextSib; }CSNode, *CSTree; void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点// { char ch; ch=getchar(); if(ch=='#')*bt=NULL; else { *bt=(BitTree)malloc(sizeof(BitNode)); (*bt)->data=ch; CreatBiTree(&((*bt)->LChild)); CreatBiTree(&((*bt)->RChild)); } } void Visit(char ch)//访问根节点 { printf("%c ",ch); }

//以下为递归遍历算法 void PreOrder(BitTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { Visit(root ->data); /*访问根结点*/ PreOrder(root ->LChild); /*先序遍历左子树*/ PreOrder(root ->RChild); /*先序遍历右子树*/ } } void InOrder(BitTree root) /*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { InOrder(root ->LChild); /*中序遍历左子树*/ Visit(root ->data); /*访问根结点*/ InOrder(root ->RChild); /*中序遍历右子树*/ } } void PostOrder(BitTree root) /* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ { if(root!=NULL) { PostOrder(root ->LChild); /*后序遍历左子树*/ PostOrder(root ->RChild); /*后序遍历右子树*/ Visit(root ->data); /*访问根结点*/ } } //中序非递归遍历 void InOrder1(struct Node *head) { struct Node *p; struct Node *stack[20]; int top=0; p=head; while(p||top!=0) { while (p)

二叉树的各种算法

二叉树的各种算法.txt 男人的承诺就像80 岁老太太的牙齿,很少有真的。你嗜烟成性的时候,只有三种人会高兴,医生你的仇人和卖香烟的。 /* 用函数实现如下二叉排序树算法: ( 1 )插入新结点 ( 2 )前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1, 失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 Input 第一行:准备建树的结点个数n 第二行:输入n 个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 Output 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列第九行:插入新结点后的二叉树的中序遍历序列(非递归算法)第十行:插入新结点后的二叉树的层次遍历序列 第十一行~第十三行:第一次交换各结点的左右子树后的先、中、后序遍历序列第十四行~第十六行:第二次交换各结点的左右子树后的先、中、后序遍历序列第十七行:二叉树的深度 第十八行:叶子结点数 */ #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1

#define OVERFLOW -2 typedef int Status; typedef int KeyType; #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;// 左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(keydata)return SearchBST(T->lchild,key,T,p); else return(SearchBST(T->rchild,key,T,p)); } Status InsertBST(BiTree &T,ElemType e) { BiTree s,p; if(!SearchBST(T,e,NULL,p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e;s->lchild=s->rchild=NULL; if(!p)T=s; else if(edata)p->lchild=s; else p->rchild=s; return TRUE; } else return FALSE; } Status PrintElement( ElemType e ) { // 输出元素e 的值 printf("%d ", e ); return OK; }// PrintElement

数据结构第6章二叉树作业与答案教材

第六章树及二叉树 一、下面是有关二叉树的叙述,请判断正误 (√)1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 (×)2.二叉树中每个结点的两棵子树的高度差等于1。 (√)3.二叉树中每个结点的两棵子树是有序的。 (×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。 (×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。(应当是二叉排序树的特点)(×)6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。(应2i-1) (×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 (×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。(应2i-1) (√)9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (正确。用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。)即有后继的指针仅n-1个。 (√)10.具有12个结点的完全二叉树有5个度为2的结点。 最快方法:用叶子数=[n/2]=6,再求n 2=n -1=5 (r ) 11、哈夫曼树中没有度为1的结点,所以必为满二叉树。 (r )12、在哈夫曼树中,权值最小的结点离根结点最近。 (r )13、线索二叉树是一种逻辑结构。 (√)14、深度为K的完全二叉树至少有2K-1个结点。 (√ )15、具有n个结点的满二叉树,其叶结点的个数为(n+1)/2。 (√ )16、前序和中序遍历用线索树方式存储的二叉树,不必使用栈。 (╳ )17、哈夫曼树是带权路径长度最短的树,路径上权值较大的点离根较远。 二、填空 1.由3个结点所构成的二叉树有5种形态。 2. 一棵深度为6的满二叉树有n 1+n 2 =0+ n 2 = n -1=31 个分支结点和26-1 =32个叶子。 注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。 3.一棵具有257个结点的完全二叉树,它的深度为9。 (注:用 log 2 (n) +1= 8.xx +1=9 4.设一棵完全二叉树有700个结点,则共有 350个叶子结点。 答:最快方法:用叶子数=[n/2]=350 5. 设一棵完全二叉树具有1000个结点,则此完全二叉树有500个叶子结点,有499个度为2的结点,有1个结点只有非空左子树,有0个结点只有非空右子树。

实验10 二叉树的基本操作

浙江大学城市学院实验报告 课程名称数据结构基础 实验项目名称实验十二叉树的基本操作 学生姓名专业班级学号 实验成绩指导老师(签名)日期2014-12-18 一.实验目的和要求 1、掌握二叉树的链式存储结构。 2、掌握在二叉链表上的二叉树操作的实现原理与方法。 3、进一步掌握递归算法的设计方法。 二.实验内容 1、按照下面二叉树二叉链表的存储表示,编写头文件binary_tree.h,实现二叉链表的定义与基本操作实现函数;编写主函数文件test4_1.cpp,验证头文件中各个操作。 二叉树二叉链表存储表示如下: struct BTreeNode { ElemType data; // 结点值域 BTreeNode *lchild , *rchild ; // 定义左右孩子指针 } ; 基本操作如下: ①void InitBTree( BTreeNode *&BT ); //初始化二叉树BT ②void CreateBTree( BTreeNode *&BT, char *a ); //根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构 ③int EmptyBTree( BTreeNode *BT); //检查二叉树BT是否为空,空返回1,否则返回0 ④int DepthBTree( BTreeNode *BT); //求二叉树BT的深度并返回该值 ⑤int FindBTree( BTreeNode *BT, ElemType x); //查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0 ⑥void PreOrder( BTreeNode *BT); //先序遍历二叉树BT ⑦void InOrder( BTreeNode *BT); //中序遍历二叉树BT ⑧void PostOrder( BTreeNode *BT); //后序遍历二叉树BT

二叉树习题(answer)

一、下面是有关二叉树的叙述,请判断正误() (). 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 ().二叉树中每个结点的两棵子树的高度差等于1。 ().二叉树中每个结点的两棵子树是有序的。 ().二叉树中每个结点有两棵非空子树或有两棵空子树。 ()二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。(应当是二叉排序树的特点) ().二叉树中所有结点个数是2k-1-1,其中k是树的深度。(应2i-1) ().二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 ().对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。(应2i-1)()用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (正确。用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。)即有后继链接的指针仅n-1个。 (√)10.具有12个结点的完全二叉树有5个度为2的结点。 最快方法:用叶子数=[n/2]=6,再求n2=n0-1=5 二、填空() 1.由3个结点所构成的二叉树有5种形态。 2. 一棵深度为6的满二叉树有n1+n2=0+ n2= n0-1=31 个分支结点和26-1 =32个叶子。 注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。 3.一棵具有257个结点的完全二叉树,它的深度为9。 (注:用 log2(n) +1= +1=9 4.设一棵完全二叉树有700个结点,则共有350个叶子结点。 答:最快方法:用叶子数=[n/2]=350

数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》 实验报告 实验题目 二叉树的基本操作及运算 一、需要分析 问题描述: 实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。 问题分析: 二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。处理本问题,我觉得应该:

1、建立二叉树; 2、通过递归方法来遍历(先序、中序和后序)二叉树; 3、通过队列应用来实现对二叉树的层次遍历; 4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等; 5、运用广义表对二叉树进行广义表形式的打印。 算法规定: 输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。 输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。 程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。 测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E 预测结果:先序遍历ABCDEGF 中序遍历CBEGDFA 后序遍历CGEFDBA 层次遍历ABCDEFG 广义表打印A(B(C,D(E(,G),F))) 叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2 查找5,成功,查找的元素为E 删除E后,以广义表形式打印A(B(C,D(,F))) 输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B 预测结果:先序遍历ABDEHCFG 中序遍历DBHEAGFC 后序遍历DHEBGFCA 层次遍历ABCDEFHG 广义表打印A(B(D,E(H)),C(F(,G))) 叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3 查找10,失败。

基于层次遍历的二叉树算法设计

题目: 基于层次遍历的二叉树算法设计 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求) 1、系统应具备的功能: (1)建立二叉树 (2)按层次遍历二叉树 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、不足之处、设计体会; (4)结束语; (5)参考文献。 时间安排:2007年7月2日-7日(第18周) 7月2日查阅资料 7月3日系统设计,数据结构设计,算法设计 7月4日-5日编程并上机调试 7月6日撰写报告 7月7日验收程序,提交设计报告书。 指导教师签名: 2007年7月2日 系主任(或责任教师)签名: 2007年7月2日

基于层次遍历的二叉树算法设计 摘要:本程序设计实现二叉树的层次遍历,该程序主要部分包括:创建二叉树,按层次遍历二叉树。. 关键字:二叉树,队列,二叉链表,数据结构 . 0.引言: 树型结构是一类重要的非线性数据结构,其中一树和二叉树最重要。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构够可以用树来形象表示。树在计算机领域中也得到了广泛应用,如在编译程序中,可以用树来表示源程序的语法结构。二叉树是一种非线性数据结构,对它进行操作时总需要对每个数据逐一进行操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作问题,所谓遍历二叉树就是按某种顺序访问二叉树中某个结点一次且仅一次的过程,这里的访问可以是输出.比较.更新.查看元素内容等各种操作。 1.需求分析: 1.1行输入数据构造二叉树。 1.2用队列存储二叉树结点。 1.3算法实现层次遍历。 1.4实现过程: A:初始,系统开始运行后,要先构造二叉树,先输入根结点数据信息。 B:根据提示信息输入其左子树,若没有左子树则输入“-1”。 C:根据提示信息输入其右子树,若没有右子树则输入“-1”。 D:在二叉树构造完成之后程序会自动按层次遍历二叉树,并且输出相应结点 数据信息。 E:在完成上述过程之后按任意键结束程序。 2.数据结构设计: 2.1树的链式存储 typedef struct Bitnode /*树的链式存储*/

编写算法交换二叉树中所有结点的左

编写算法交换二叉树中所有结点的左、右子树 #include"stdio.h" #include"malloc.h" #define maxsize 10 #define NULL 0 typedefstruct node{ char data; struct node *lchild,*rchild; }Bintree; Bintree *Q[maxsize]; Bintree *creatree(){ charch; int front=1,rear=0; Bintree *T,*S; T=NULL; ch=getchar(); while(ch!='#'){ S=NULL; if(ch!='@'){ S=(Bintree *)malloc(sizeof(Bintree)); S->data=ch; S->lchild=S->rchild=NULL; } rear++; Q[rear]=S; if(rear==1) T=S; else{ if(S!=NULL&&Q[front]!=NULL) if(rear%2==0) Q[front]->lchild=S; else Q[front]->rchild=S; if(rear%2==1) front++; } ch=getchar(); } return T; } voidprintree(Bintree *T){ if(T){ printf("%2c",T->data); printree(T->lchild); printree(T->rchild); } } voidchangetree(Bintree *T){ if(T){ Bintree *A; changetree(T->lchild);

二叉树应用之二叉树基本算法的实现

二叉树应用——二叉树基本算法的实现 【功能要求】 实现Create方法,要求键盘输入二叉树结点序列,创建一棵二叉树(提示:前序递归) 实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树(提示:前序递归) 增加InorderTree方法,采用非递归方法实现二叉树的中序遍历 你可以选择: 对BinaryTree模板进行功能扩充; 自己定义并实现二叉树类 要求键盘输入二叉树结点序列 结点序列可以是前序,也可以是层次 空结点以#表示 【代码实现】 // 二叉树01.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include using namespace std; template class BinaryTreeNode; template class BinaryTree { public: BinaryTree() { root=0; } BinaryTree(const BinaryTree &Tree ) { copy(Tree.root,root); } ~BinaryTree(){}; bool IsEmpty()const { return ((root)?false:true); } void Creat();

bool Root (T&x)const; void MakeTree(const T&element,BinaryTree&left,BinaryTree&right); void BreakTree( T&element,BinaryTree&left,BinaryTree&right); void PreOrder(void (*Visit)(BinaryTreeNode*u)) { PreOrder(Visit,root); } void InOrder(void (*Visit)(BinaryTreeNode*u)) { InOrder(Visit,root); } void PostOrder(void (*Visit)(BinaryTreeNode*u)) { PostOrder(Visit,root); } void LevelOrder(void(*Visit)(BinaryTreeNode*u)); void PreOutput() { PreOrder(Output,root); cout<

相关文档
最新文档