树的基本操作

包括创建一个新树,

销毁一个树

输入为字符,输入‘#’表示为空树,停止

和插入二叉树

暂时,删除一个二叉树????

输入示例:AB#DE###C##

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef char TElemType;
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void InitBiTree(BiTree &T);
void DestoryBiTree(BiTree &T);
void CreateBiTree(BiTree &T);
bool BiTreeEmpty(BiTree T);
int  Now_BiTreeDepth(BiTree T,int h,int &depth);
int  BiTreeDepth(BiTree T);
void Parent(BiTree T,BiTNode e);
void LeftChild(BiTree T,BiTNode e);
void RightChild(BiTree T,BiTNode e);
void LeftSibling(BiTree T,BiTNode e);
void InsertChild(BiTree p,int LR,BiTree c);
void DeleteChild(BiTree p,int LR);
void Traverse(BiTree T);
void visit(BiTree T);
void Preorder(BiTree T,void(*visit)(BiTree));
void Inorder(BiTree T,void(*visit)(BiTree));
void Sucorder(BiTree T,void(*visit)(BiTree));
int main()
{
    BiTree T=new BiTNode;
    InitBiTree(T);
    CreateBiTree(T);
    cout<<"Preorder: "<<endl;
    Preorder(T,visit);
    cout<<endl;
    cout<<"Inorder: "<<endl;
    Inorder(T,visit);
    cout<<endl;
    cout<<"Sucorder"<<endl;
    Sucorder(T,visit);
    cout<<endl;
    int length=BiTreeDepth( T);
    cout<<"the depth of this tree is: "<<length<<endl;
    BiTree c=new BiTNode;
    c->data='M';
    c->lchild=c->rchild=NULL;
    InsertChild(T,1,c);
    Preorder(T,visit);
    cout<<endl;
    DestoryBiTree(T);

    return 0;
}
void InitBiTree(BiTree &T)
{
    //构造一颗空的二叉树T
    T=NULL;
}
void DestoryBiTree(BiTree &T)
{
    //销毁一个二叉树T
    if(T)
    {
        if(T->lchild)
            DestoryBiTree(T->lchild);
        if(T->rchild)
            DestoryBiTree(T->rchild);
        delete T;
        T=NULL;
    }
}
void CreateBiTree(BiTree &T)
{
    //输入AB#DE###C##
    //构造二叉树
    TElemType ch;
    cout<<"Input an element:";
    cin>>ch;
    if(ch=='#')
        T=NULL;
    else{
        T=new BiTNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
bool BiTreeEmpty(BiTree T)
{
    if(T==NULL)
        return true;
    else
        return false;
}
int Now_BiTreeDepth(BiTree T,int h,int &depth)
{
    //h为T指向的结点所在层次,T指向二叉树的根,h的初始值为1
    if(T)
    {
        if(h>depth)
            depth=h;
        Now_BiTreeDepth(T->lchild,h+1,depth);
        Now_BiTreeDepth(T->rchild,h+1,depth);
    }
}
int  BiTreeDepth(BiTree T)
{
    if(!T)
        return 0;
    else{
        int hL=BiTreeDepth(T->lchild);
        int hR=BiTreeDepth(T->rchild);
        if(hL>=hR)
            return hL+1;
        else
            return hR+1;
    }
}
void LeftChild(BiTree T,BiTNode e);
void RightChild(BiTree T,BiTNode e);
void LeftSibling(BiTree T,BiTNode e);
void InsertChild(BiTree p,int LR,BiTree c)
{
    //二叉树T存在,p指向T中某个结点,非空二叉树与T不相交且右子树为空
    //LR=0,则插入C为p所指结点左子树,否则,右子树;p所指结点原有左或右子树,成为c右或左子树
   if(p){
    if(LR==0){
        c->rchild=p->lchild;
        p->lchild=c;
    }
    else{
        c->lchild=p->rchild;
        p->rchild=c;
    }
   }
}
void visit(BiTree T)
{
    if(T)
        cout<<T->data<<" ";
}
void Preorder(BiTree T,void(*visit)(BiTree))
{
    if(T){
        visit(T);
        Preorder(T->lchild,visit);
        Preorder(T->rchild,visit);
    }
}
void Inorder(BiTree T,void(*visit)(BiTree))
{
    if(T){
        Inorder(T->lchild,visit);
        visit(T);
        Inorder(T->rchild,visit);
    }
}
void Sucorder(BiTree T,void(*visit)(BiTree))
{
    if(T){
        Sucorder(T->lchild,visit);
        Sucorder(T->rchild,visit);
        visit(T);
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值