[数据结构][C++] 树和二叉树的代码实现

6 篇文章 0 订阅
5 篇文章 0 订阅

问题描述:

任意给出一棵二叉树,试设计一个程序,在计算机中构造该二叉树,并对它进行先序、中序、后序遍历。

二叉树的建立和各种遍历算法在教材中,已经有很详细的介绍。本例将介绍另外一种建立二叉树的算法。同时介绍对“遍历算法”灵活应用:修改原有二叉树中结点的数值;将二叉树中每个结点的左右子树进行交换。
本例介绍二叉树的建立是一个递归方法,与二叉树先序遍历思路有点相似。数据的组织是先序遍历的顺序,但是当某结点的某孩子为空时以数据0来充当,也要输入。

结合右图的二叉树,其数据的输入顺序应该是:
1 2 4 0 0 0 3 5 0 7 0 0 6 8 0 0 9 0 0。
若当前数据不为0,则申请一个结点存入当前数据。如果输入0表明是空(NULL),不分配结点。递归调用建立函数,建立当前结点的左右子树。

代码实现:

#include <iostream.h>
#include <conio.h>
typedef int ElemType;
struct NodeType                                   //定义结点 结构体
{       ElemType   data;
NodeType  *lch,*rch;
};
class BiTree                                 //定义 二叉树类 class
{public:
BiTree(){root=NULL;};                    //构造函数
~BiTree(){destroy(root) ;}                  //析构函数
void inorder()                            //中序遍历
{         inorder(root);  }
void preordertswap()                       //利用先序遍历方法交换左右子树
{         preorderswap(root);  }
int  theight()                             //求二叉树高度
{         return height(root);  }
void creat0();
private:
        NodeType *root;                         //数据成员,树根
        NodeType *creat();                       //建立二叉树递归方法
        void inorder(NodeType *p);                //中序遍历
        void preorderswap(NodeType *p);           //利用先序遍历方法交换左右子树
        int height(NodeType *p);                       //求二叉树高度递归算法
        void  destroy(NodeType* &p);             //删除二叉树所有结点
};
void  BiTree::creat0()                         //建立树函数,
{  
        cout<<"请按照树的先序遍历顺序组织数据"<<endl;
        cout<<"若结点信息是int,把每个结点的空孩子以0输入;"<<endl;
        cout<<"一个结点的二叉树11,输入:11 0 0;"<<endl;
        root=creat();                            //调用私有creat();
}
NodeType * BiTree::creat()                      //递归建立二叉树算法
{ NodeType *p;   ElemType x;
cout<<"\n 输入数据:";  cin>>x;
if( x==0) p=NULL;
else { p=new NodeType;  p->data=x;
p->lch=creat();                  //递归调用自身
p->rch=creat();
}
return p;
}
void BiTree::inorder(NodeType *p)             //中序遍历
{  
        if(p!=NULL)
        {
                inorder(p->lch);
                cout<<p->data;
                inorder(p->rch);
        }

        
        
}
void BiTree::preorderswap(NodeType *p)         //利用先序遍历方法交换左右子树
{          if(p != NULL)
{      NodeType *r; r=p->lch;
p->lch=p->rch; p->rch=r;
//上面几条语句可以认为对结点的访问(交换左右孩子)
//替换了原来的: cout<<p->data<<" ";  语句
preorderswap(p->lch);
preorderswap(p->rch);
}
}
void  BiTree::destroy(NodeType* &p)            //删除二叉树所有结点
{        if(p != NULL)
{   destroy(p->lch);
destroy(p->rch);
delete p;
p = NULL;
}
}
int BiTree::height(NodeType *p)                //求二叉树高度递归
{       
        int l,r;
        if(p!=NULL)
        {
                l=height(p->lch);
                r=height(p->rch);
                if(l>r) {l++;return l;}
                else {r++;return r;}
        }
        else return 0;
        
        
        
        
}
//---------------------------------------------------------------------------
int main()
{ int k;     BiTree root0;                     //声明创建二叉树对象,调用构造函数
do{ cout<<"\n\n";
cout<<"\n\n     1. 建立二叉树";
cout<<"\n\n     2. 交换左右子树 ";
cout<<"\n\n     3. 求二叉树深度  ";
cout<<"\n\n     4. 结束程序运行";
cout<<"\n======================================";
cout<<"\n     请输入您的选择 (0,1,2,3,4):"; cin>>k;
switch(k)
{  case 1:{  cout<<"\n  s输入(0 0)结束:";
root0.creat0();
cout<<"\n     中先根遍历结果:";  root0.inorder();
} break;
case 2:{  cout<<"\n     交换左右子树结果:";
        root0.preordertswap();
        cout<<"\n     中先根遍历结果:";
        root0.inorder();
           } break;
case 3:{   int deep;//=root0.theight();
        deep=root0.theight();
        cout<<"\n  树的深度是:"<<deep;
           } break;
//case 4: exit(0);
} 
cout<<"\n ----------------";
} while(k>=0 && k<4);
_getch();   return 0;
}//-----  

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值