数据结构算法Day05

四、树

typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

1、计算二叉树中所有结点的个数

注意count的位置

法一:

int count=0;
void countNode(BiTree T){
    if(T!=NULL){
        count++;
        countNode(T->lchild);
        countNode(T->rchild);
    }
}

法二:

int countNode(BiTree T){
    int count=0;
    if(T==NULL)
        return 0;
    else 
        return countNode(T-lchild)+countNode(T->rchild)+1;
}

二、计算二叉树中所有叶子结点的个数

int count=0;
void countLeaf(BiTree T){
    if(T!=NULL){
        countLeaf(T->lchild);
        countLeaf(T->rchild);
        if(T->lchild==NULL && T->rchild==NULL)
            count++;
    }
}

三、计算二叉树结点中所有双分支结点的个数

int count=0;
void doubleLeaf(BiTree T){
    if(T!=NULL){
        if(T->lchild && T->rchild)
            count++;
        doubleLeaf(T->lchild);
        doubleLeaf(T->rchild);
    }
}

四、计算二叉树的深度

int Depth(BiTree T){
    if(T==NULL)
        return 0;
    else{
        int l=Depth(T->lchild);
        int r=Depth(T->rchild);
        return l>r ? l+1:r+1;
    }
}

五、(a-(b+c))*(d/e)存储在二叉树,遍历求值

算出左子树的值,算出右子树的值,最终将两值进行运算

//基本运算
int biscomp(int a,int b,char opr){
    switch(opr){
        case '+':
            return a+b;
        case '-':
            return a-b;
        case '*':
            return a*b;
        case '/':
            return a/b;
    }
}
//算出左子树的值,算出右子树的值,进行运算
int compute(BiTree T){
    int a,b;
    if(T==NULL)
        return 0;
    else{
        if(T->lchild && T->rchild){
            a=compute(T->lchild);
            b=compute(T->rchild);
            return biscomp(a,b,T);
        }
        else{
            return T->data;
        }
    }
}

六、找出二叉树中最大的点

找出右子树最大的值,找出左子树最大的值,将两值进行比较,选出最大值与根进行比较

int MaxNode(BiTree T){
    int max,maxroot,maxl,maxr;
    if(T){
        maxroot = T->data;
        maxl=MaxNode(T->lchild);
        maxr=MaxNode(T->rchild);
        if(maxl>maxr)
            max=maxl;
        else
            max=maxr;
        if(max < maxroot)
            max=maxroot;
        }
    else{
         return 0;
        }
    return max;
}

七、判断两个二叉树是否相似

若T1和T2都是空树,则两树相似,若一个为空一个不为空,则必然不相似。

int Similar(BiTree T1,BiTree T2){
    int l,r;
    if(T1==NULL&&T2==NULL)
        return 1;
    else if(T1==NULL||T2==NULL)
        return 0;
    else{
        l=Similar(T1->lchild,T2->lchild);
        r=Similar(T1->rchild,T2->rchild);
        return l&&r;
    }
}
        

八、把二叉树所有结点子树交换

交换左子树的结点,交换右子树的结点,交换左右子树的结点

void swap(BiTree T){
    BiTree temp;
    if(T){
        swap(T->lchild);
        swap(T->rchild);
        temp=T->lchild;
        T->lchild=T->rchild;
        T->rchild=temp;
    }
}

九、查找二叉树中data域等于key的结点是否存在

BiNode* findNode(BiTree T,int key){
    BiNode *p;
    if(T==NULL)
        return NULL;
    else{
        if(T->data==key)
            return T;  
        //判断左子树中是否有key
        p=findNode(T->lchild,key);
        if(p)
            return p;
        //判断右子树中是否有key
        p=findNode(T->rchild,key);
        if(p)
            return p;
    }
    return NULL;
}

十、输出先序遍历第k个结点的值

设置一个变量p记录每遍历一个结点的次数,找到当p为k时的那个结点,输出该结点的值

int p=1;//记录次数
ElemType PreNode(BiTree T,int k){
    ElemType ch;
    if(T==NULL)
        return '#';
    if(p==k)
        return T->data;
    p++;
    ch=PreNode(T->lchild,k);
    if(ch !='#')
        return ch;
    ch=PreNode(T->lchild,k);
        return ch;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值