现在的位置: 首页 > 综合 > 正文

数据结构-二叉树

2012年10月27日 ⁄ 综合 ⁄ 共 5024字 ⁄ 字号 评论关闭

//二叉树
//时间: 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);

}

抱歉!评论已关闭.