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

问题描述:

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

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

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

代码实现:

#include 
#include 
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<<"请按照树的先序遍历顺序组织数据"<>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<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<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  树的深度是:"<=0 && k<4);
_getch();   return 0;
}//-----  

 

你可能感兴趣的:(c/c++,算法,学习)