//二叉树
//时间: 05/07/08
//程序: 张建波
//功能:输入二叉树,完成前序、中序、后序、层序遍历
#include <iostream.h>
#include "Menu.h"
#include "key.h"
struct tree
{
int data; // 节点数据
struct tree *left; // 左子树
struct tree *right; // 右子树
};
struct MT{
int data[100]; //保存每层元素
int n; //每层元素的个数
}; //层序遍历保存二叉树的结点
struct MT mt[100]; //假定二叉树最大层数 不超过100层
typedef struct tree treenode; // 树的结构型态
typedef treenode *btree; // 树节点指标型态
void _InputData(int *data); //输入二叉树数据
btree insertnode(btree root,int value); //插入二叉树的节点
btree createbtree(int *data,int len); //建立二叉树
void inorder(btree ptr);// 二叉树中序遍历
void preorder(btree ptr); //二叉树前序遍历
void postorder(btree ptr);//二叉树后序遍历
void CX(btree ptr,int n); //二叉树层序遍历
void _preorder_main(int *data,int n); //前序遍历_测试程序
void _inorder_main(int *data,int n); // 中序遍历_测试程序
void _postorder_main(int *data,int n); //后序遍历列__测试程序
void _CenXu_order_main(int *data,int n);//层序遍历__测试程序
void _ViewTree_main(int *data,int); //浏览树
int _Edit_data(int *data); //修改初始数据
int _f3_main(){ //程序入口
Menu m[10]; //绘制菜单
m[1].Name="输入树";
m[2].Name="浏览树";
m[3].Name="前序遍历 ";
m[4].Name="中序遍历 ";
m[5].Name="后序遍历";
m[6].Name="层序遍历";
m[7].Name="返回";
m[8].Name=" ";
int DATA_Tree[1000] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 };
int n=9;
int *data=DATA_Tree;
int ID=1;
while(1)
{
ShowMenu("数据结构--二叉树遍历",m,8); //显示菜单
ID=SelectMenuID(); //获取选中的菜单ID
switch(ID){
case 1:{n=_Edit_data(data);InitKey();}break;
case 2:{_ViewTree_main(data,n);InitKey();}break;
case 3:{_preorder_main(data,n);InitKey();}break;
case 4:{_inorder_main(data,n);InitKey();}break;
case 5:{_postorder_main(data,n);InitKey();}break;
case 6:{_CenXu_order_main(data,n);InitKey();}break;
case 7:return 0;
case 8:break;
}
}
return 0;
}
int _Edit_data(int *data){ //修改初始数据
int n;
cout<<"\n请输入结点总数n=";
cin>>n;
cout<<"输入每个结点的数据"<<endl;
cout<<"例如依次输入:5, 6, 4, 8, 2, 3, 7, 1, 9\n"<<endl;
for(int i=0;i<n;i++){ //输入数据
cout<<"["<<i<<"]=";
cin>>data[i];
cout<<"\n";
}
cout<<"\n您输入的数据为:";
for(int j=0;j<n;j++)cout<<data[j]<<" ";
return n;
}
btree insertnode(btree root,int value){ //插入二叉树的节点
btree newnode; //树根
btree current; //目前树节点指标
btree back; //父节点指标
newnode=new treenode; //建立新节点
newnode->data = value; //建立节点内容
newnode->left = NULL; //设定指标初值
newnode->right = NULL; //设定指标初值
if(root==NULL) return newnode; //是根节点传回新节点位置
else
{
current = root; //保留目前树指标
while ( current != NULL )
{
back = current; //保留父节点指标
if ( current->data > value ) //比较节点值
current = current->left; //左子树
else
current = current->right; //右子树
}
if (back->data>value )back->left = newnode; // 左子树
else back->right = newnode; // 右子树
}
return root; // 返回树根
}
btree createbtree(int *data,int len){ //建立二叉树
btree root = NULL; // 树根指标
int i;
for ( i = 0; i < len; i++ ) // 用回路建立树状结构
root = insertnode(root,data[i]);
return root;
}
void preorder(btree ptr){ //二叉树前序遍历
if ( ptr != NULL )
{
cout<<ptr->data<<" ";
preorder(ptr->left);
preorder(ptr->right);
}
}
void inorder(btree ptr){// 二叉树中序遍历
if ( ptr != NULL ) // 终止条件
{
inorder(ptr->left); // 左子树
cout<<ptr->data<<" ";
inorder(ptr->right); // 右子树
}
}
void postorder(btree ptr){//二叉树后序遍历
if ( ptr != NULL )
{
postorder(ptr->left);
postorder(ptr->right);
cout<<ptr->data<<" ";
}
}
void _preorder_main(int *data,int n){ //先序遍历_测试程序
btree root = NULL;
root = createbtree(data,n); //建立二叉树
cout<<"树的节点内容 n=";
preorder(root); //先序遍历二叉树
}
void _inorder_main(int *data,int n){ // 中序遍历_测试程序
btree root = NULL;
root = createbtree(data,n); //建立二叉树
cout<<"树的节点内容 n=";
inorder(root); //中序遍历二叉树
}
void _postorder_main(int *data,int n){ //后序遍历列__测试程序
btree root = NULL;
root = createbtree(data,n); //建立二叉树
cout<<"树的节点内容 n=";
postorder(root); //后序遍历二叉树
}
//~
//////////////////////////////////////////////
int max_n=0;//保存最大层数
void CX(btree ptr,int n) //层序遍历
{
if ( ptr != NULL )
{
n++; //层计数
if(max_n<n)max_n=n;//保存最大层数
mt[n].data[mt[n].n]=ptr->data; //保存当前层的数据
mt[n].n=mt[n].n+1; //把该层的 元素个数+1
CX(ptr->left,n); //继续浏览 左结点
CX(ptr->right,n); //继续浏览 右结点
}
}
void _CenXu_order_main(int *data,int n){//层序遍历
btree root = NULL;
root = createbtree(data,n); //建立二叉树
cout<<"树的节点内容";
for(int m=0;m<100;m++)mt[m].n=0;
CX(root,0);
cout<<"该二叉树的各层数据如下:"<<endl;
for(int mm=0;mm<=max_n;mm++)
{
for(int mn=0;mn<mt[mm].n;mn++)
{
cout<<mt[mm].data[mn]<<" ";
}
cout<<"\n";
}
}
void ViewTree(btree ptr){ //浏览树
if ( ptr != NULL ) // 终止条件
{
cout<<ptr->data;
if(ptr->left!=NULL || ptr->right!=NULL)
{
cout<<"(";
ViewTree(ptr->left);
if(ptr->right!=NULL)cout<<",";
ViewTree(ptr->right);
cout<<")";
}
}
}
void _ViewTree_main(int *data,int n) //浏览树
{
btree root = NULL;
root = createbtree(data,n); //建立二叉树
cout<<"树的节点内容 n=";
ViewTree(root);
}
分享到:
相关推荐
"数据结构--二叉树--思维导图" 二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个孩子节点,分别是左子树和右子树。二叉树可以用来存储大量数据,并且可以快速地查找、插入和删除数据。 二叉树的...
数据结构-二叉树的建立先序中序后序层次遍历
二叉树是数据结构中的重要概念,它是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。在计算机科学中,二叉树的应用广泛,涉及搜索、排序、编译器设计等多个领域。本主题将深入探讨...
数据结构-二叉树的建立及遍历操作
数据结构-二叉树Java实现及其遍历算法,代码示例中实现了中序遍历,简单易学。
二叉树是计算机科学中一种重要的数据结构,它在很多领域如计算机图形学、编译原理、数据库系统等都有广泛的应用。在这个“数据结构-二叉树汇总”中,我们将深入探讨二叉树的基本概念、类型、操作以及相关算法。 ...
在IT领域,数据结构是计算机科学的基础,而二叉树作为一种重要的数据结构,广泛应用于搜索、排序、图形处理等场景。本主题将深入探讨二叉树的算法拓展,特别是关于交换左右子树、将二叉链表转换为完全二叉树以及寻找...
《数据结构-二叉树的建立与遍历》实验报告主要涵盖了如何使用链式存储结构构建二叉树以及非递归方式实现二叉树的先序遍历。实验旨在通过Visual C++6.0上机调试,提升对二叉树理论的理解及实际操作能力。 在实验需求...
### 数据结构 - 二叉树的定义及基本操作 #### 实验目的与意义 本实验旨在帮助学生深入了解二叉树这一重要的数据结构,并通过实践掌握其基本操作。具体包括: 1. **熟悉二叉链表表示的二叉树结构及其递归遍历**:...
### Java基础复习笔记08数据结构-二叉树和二叉树的遍历 #### 一、二叉树概述 二叉树(Binary Tree)是一种重要的数据结构,在计算机科学中有广泛的应用。二叉树中的每个节点最多有两个子节点,分别称为左子节点和右...
在IT领域,数据结构是计算机科学的基础,而二叉树作为一种重要的数据结构,广泛应用于算法设计、数据库系统、编译器等。本资料主要聚焦于使用C++语言实现二叉树的遍历方法,这对于理解和掌握C++编程以及数据结构至关...
相关链接 二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客二叉树的链式存储结构 #include...
在IT领域,数据结构是计算机科学的基础,而二叉树作为一种重要的数据结构,被广泛应用于算法设计、数据库系统、编译器等领域。本教程将详细阐述如何使用JAVA语言实现二叉树的相关操作。 首先,我们要了解二叉树的...
二叉树作为一种重要的数据结构,广泛应用于计算机科学的各个领域,如编译器设计、操作系统、数据库、图形学等。它的遍历是理解和操作二叉树的基础,这其中包括前序遍历、中序遍历、后序遍历以及层次遍历(也称为广度...
### 数据结构中的二叉树及存储结构 #### 一、二叉树的定义与形态 **二叉树**是一种常见的数据结构,它是由一个或多个节点组成的集合,这些节点之间存在一种特定的层次关系。根据定义,二叉树可以为空;如果不为空...