二叉树的基本操作(简单易懂)

二叉树基本操作

1.初始化
2.建树
3.销毁树
4.插入操作
5.查找元素值为e的节点的指针
6.查找元素值为e的节点左节点的值
7.查找元素值为e的节点右节点的值
8.删除左子树
9.删除右子树
10.先序遍历
11.中序遍历
12.后序遍历

  1. 计算叶子节点数
    14.计算非叶子节点数
    15.计算树的深度

    我输入的树按先序输入

    ABC##D##EF#G##HI###
    1342501-20181113154728932-344207035.png

代码

#include<bits/stdc++.h>
using namespace std;
const int maxsize=1000; 
typedef struct Node{
    char date;
  struct Node *lchild;
    struct Node *rchild;
}*BiTree,BitNode;
void InitBitree(BiTree *T){
    *T=NULL;
}
void DestroyBitree(BiTree *T){
    if(*T){
        if((*T)->lchild)
        DestroyBitree(&((*T)->lchild));
        if((*T)->rchild)
        DestroyBitree(&((*T)->rchild));
        free(*T);
        *T=NULL;
    }
}
void CreateBitree(BiTree *T){
    char ch;
    cin>>ch;
    if(ch=='#') *T=NULL;
    else{
        *T=(BiTree)malloc(sizeof(BitNode));//生成根节点
        if(!(*T))
            exit(-1);
        (*T)->date=ch;
        CreateBitree(&((*T)->lchild));//递归创建左右子树 
        CreateBitree(&((*T)->rchild));
    }
}
bool InsertLeftchild(BiTree p,BiTree c)//将c插入T,c作为p的左子树
{
    if(p){
        c->lchild=p->lchild;
        p->lchild==c;
        return 1;
    } 
    return 0;
} 
bool InsertRightchild(BiTree p,BiTree c){//将c插入T,c作为p的右子树
    if(p){
        c->rchild=p->rchild;
        p->rchild=c;
        return 1;
    } 
    return 0;
}
BitNode *Point(BiTree T,char e)//查找元素值为e的节点的指针
{
    BiTree q[maxsize];//创建空队列 
    int front=0,rear=0;
    BitNode *p;
    if(T){//如果树非空 
        q[rear]=T;
        rear++;
        while(front!=rear){//如果队列非空 
            p=q[front];
            front++;
            if(p->date==e) return p;
            if(p->lchild){
                q[rear]=p->lchild;
                rear++;
            }
            if(p->rchild){
                q[rear]=p->rchild;
                rear++;
            }
        }
    } 
    return NULL;
}
char LeftChild(BiTree T,char e){//查找元素值为e的节点左节点的值 
    BiTree p;
    if(T){
        p=Point(T,e);
    if(p&&p->lchild) return p->lchild->date;
    }
    //return;
} 
char RightChild(BiTree T,char e){//查找元素值为e的节点右节点的值 
    BiTree p;
    if(T){
        p=Point(T,e);
        if(p&&p->rchild) return p->rchild->date;
    }
    //return ;
}
bool DelectLeftChild(BiTree p){//删除左子树 
    if(p){
        DestroyBitree(&(p->lchild));
        return 1;
    }
    return 0;
}
bool DelectRightChild(BiTree p){//删除右子树 
    if(p){
        DestroyBitree(&(p->rchild));
        return 1;
    }
    return 0;
} 
//二叉树的遍历(递归地遍历),先序(根左右),中序(左根右),后序(左右根) 
void PreOrderTraverse(BiTree T){
    if(T){
        printf("%2c",T->date);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
} 
void InOrderTraverse(BiTree T){
    if(T){
        InOrderTraverse(T->lchild);
        printf("%2c",T->date);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T){
    if(T){
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%2c",T->date);
    }
}
int leafnum(BiTree T){//叶子节点数 
    if(!T) return 0;
    else if((!T->lchild)&&(!T->rchild)) return 1;
    else return leafnum(T->lchild)+leafnum(T->rchild);
} 
int Notleafnum(BiTree T){//非叶子节点数 
    if(!T) return 0;
    else if(!T->lchild&&!T->rchild) return 0;
    else return Notleafnum(T->lchild)+Notleafnum(T->rchild)+1;
}
int deapth(BiTree T){
    if(!T) return 0;
    else return deapth(T->lchild)>deapth(T->rchild)? deapth(T->lchild)+1:deapth(T->rchild)+1;
} 
int main(){
    BiTree T,root;
    //freopen("in.txt","r",stdin);
    InitBitree(&T);
    cout<<"According to the first order to create a binary tree\n";//按先序建树 
    CreateBitree(&T);
    cout<<"First sequence traversal of binary tree is\n";//先序遍历 
    PreOrderTraverse(T);
    cout<<endl; 
    cout<<"In the binary tree traversal is\n";//中序遍历 
    InOrderTraverse(T);
    cout<<endl;
    cout<<"After the binary tree traversal is\n";//后序遍历 
    PostOrderTraverse(T);
    cout<<endl;
    cout<<"E's leftChild is"<<' '<<LeftChild(T,'E')<<endl;//E的左儿子 
    cout<<"E's RightChild is"<<' '<<RightChild(T,'E')<<endl;//E的右儿子
    cout<<"The tree's leafnumber is "<<leafnum(T)<<endl;//叶子节点数 
    cout<<"The tree's notleafnumber is "<<Notleafnum(T)<<endl;//非叶子节点数 
    cout<<"The tree's deapth is "<<deapth(T)<<endl;//树的深度 
    DelectLeftChild(T)?cout<<"Delection is success\n":"Delection is fail\n";//删除树的左子树 
    //删除后看一下里面的什么情况
    cout<<"First sequence traversal of binary tree is\n";//先序遍历 
    PreOrderTraverse(T);
    cout<<endl; 
    cout<<"In the binary tree traversal is\n";//中序遍历 
    InOrderTraverse(T);
    cout<<endl;
    cout<<"After the binary tree traversal is\n";//后序遍历 
    PostOrderTraverse(T);
    cout<<endl; 
    cout<<"The tree's leafnumber is "<<leafnum(T)<<endl;//叶子节点数 
    cout<<"The tree's notleafnumber is "<<Notleafnum(T)<<endl;//非叶子节点数 
    cout<<"The tree's deapth is "<<deapth(T)<<endl;//树的深度 
    return 0;
}

转载于:https://www.cnblogs.com/mch5201314/p/9952626.html

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值