求二叉树有多少个度为2、0的结点

#include<stdio.h>
#include<malloc.h>
//2013-12-23 
//乾卦
#define MAX 256
typedef struct Node
{
    char data;
    struct Node *rchild;
    struct Node *lchild;
}BTNode;
//创建二叉树
void CreatBT(BTNode *&root,char *str)
{
    int top=0;
    int j=0;
    BTNode *st[MAX];
    BTNode *p=NULL;
    int flg=0;
    root=NULL;
    while(str[j]!='\0')
    {
        if(str[j]=='(')
        {
            top++;
            st[top]=p;
            flg=1;
        }
        else if(str[j]==')')
        {
            top--;
        }
        else if(str[j]==',')
        {
            flg=2;
        }
        else
        {
            p=(BTNode*)malloc(sizeof(BTNode));
            if(!p)
            {
                printf("申请空间失败!\n");
                return ;
            }
            p->data=str[j];
            p->lchild=NULL;
            p->rchild=NULL;
            if(!root)
            {
                root=p;
            }
            else
            {
                if(flg==1)
                    st[top]->lchild=p;
                if(flg==2)
                    st[top]->rchild=p;
            }
        }
        j++;
    }

    return ;
}
//求二叉树有多少个度为2的结点
int Func(BTNode *root)
{
    int flg=0;
    int count=0;
    BTNode* queue[MAX];
    BTNode* p=NULL;
    int rear=-1,front=-1;

    if(!root)
        return -1;
    rear++;
    queue[rear]=root;
    while(rear!=front)
    {
        front++;
        p=queue[front];
        flg=0;
        if(p->lchild)
        {
            //进队
            rear++;
            queue[rear]=p->lchild;
            flg++;
        }
        if(p->rchild)
        {
            rear++;
            queue[rear]=p->rchild;
            flg++;
        }
        if(2==flg)
            count++;
    }

    return count;
}

void main()
{
    int i;
    BTNode *ROOT=NULL;
    CreatBT(ROOT,"A(B(D(,G)),C(E,F))");
    i=Func(ROOT);
    printf("一共有%d个度为2的结点\n",i);
    //完全二叉树 1+2+1=4
    CreatBT(ROOT,"A(B(D(H,I),E),C(F,G))");
    i=Func(ROOT);
    printf("一共有%d个度为2的结点\n",i);
    //高度为4的满二叉树 1+2+4=7
    CreatBT(ROOT,"A(B(D(H,I),E(J,K)),C(F(L,M),G(N,O)))");
    i=Func(ROOT);
    printf("一共有%d个度为2的结点\n",i);
    //0
    CreatBT(ROOT,"A(,B(C(,D(E))))");
    i=Func(ROOT);
    printf("一共有%d个度为2的结点\n",i);
    //0
    CreatBT(ROOT,"A(B,)");
    i=Func(ROOT);
    printf("一共有%d个度为2的结点\n",i);
    //
    CreatBT(ROOT,"A(B(D,E),C(F(H(J,K),I),G))");
    i=Func(ROOT);
    printf("一共有%d个度为2的结点\n",i);
    return ;
}

 

#include<stdio.h>
#include<malloc.h>
//2013-12-24 
//乾卦
#define MAX 256
typedef struct Node
{
    char data;
    struct Node *rchild;
    struct Node *lchild;
}BTNode;
//创建二叉树
void CreatBT(BTNode *&root,char *str)
{
    int top=0;
    int j=0;
    BTNode *st[MAX];
    BTNode *p=NULL;
    int flg=0;
    root=NULL;
    while(str[j]!='\0')
    {
        if(str[j]=='(')
        {
            top++;
            st[top]=p;
            flg=1;
        }
        else if(str[j]==')')
        {
            top--;
        }
        else if(str[j]==',')
        {
            flg=2;
        }
        else
        {
            p=(BTNode*)malloc(sizeof(BTNode));
            if(!p)
            {
                printf("申请空间失败!\n");
                return ;
            }
            p->data=str[j];
            p->lchild=NULL;
            p->rchild=NULL;
            if(!root)
            {
                root=p;
            }
            else
            {
                if(flg==1)
                    st[top]->lchild=p;
                if(flg==2)
                    st[top]->rchild=p;
            }
        }
        j++;
    }

    return ;
}

int SumLeaf(BTNode *root)
{
    int flg=0;
    int count1=0,count2=0,count_sum=0;
    
    BTNode* queue[MAX];
    BTNode* p=NULL;
    int rear=-1,front=-1;

    if(!root)
        return -1;
    rear++;
    queue[rear]=root;
    while(rear!=front)
    {
        
        front++;
        p=queue[front];
        //计算总结点数
        count_sum++;
        flg=0;
        if(p->lchild)
        {
            //进队
            rear++;
            queue[rear]=p->lchild;
            flg++;
        }
        if(p->rchild)
        {
            rear++;
            queue[rear]=p->rchild;
            flg++;
        }
        if(1==flg)
        {
            count1++;
            
        }
        if(2==flg)
        {
            count2++;
        }
    }
    //总结点-结点数为1的-结点数为2的
    return (count_sum-count2-count1);
}

void main()
{
    int i;
    BTNode *ROOT=NULL;
    CreatBT(ROOT,"A(B(D(,G)),C(E,F))");
    i=SumLeaf(ROOT);
    printf("一共有%d个度为0的结点\n",i);
    //高度为4的满二叉树 1+2+4=7
    CreatBT(ROOT,"A(B(D(H,I),E(J,K)),C(F(L,M),G(N,O)))");
    i=SumLeaf(ROOT);
    printf("一共有%d个度为0的结点\n",i);
    return ;
}

比上面简单的算法:

#include<stdio.h>
#include<malloc.h>
//2013-12-24 
//乾卦
#define MAX 256
typedef struct Node
{
    char data;
    struct Node *rchild;
    struct Node *lchild;
}BTNode;
//创建二叉树
void CreatBT(BTNode *&root,char *str)
{
    int top=0;
    int j=0;
    BTNode *st[MAX];
    BTNode *p=NULL;
    int flg=0;
    root=NULL;
    while(str[j]!='\0')
    {
        if(str[j]=='(')
        {
            top++;
            st[top]=p;
            flg=1;
        }
        else if(str[j]==')')
        {
            top--;
        }
        else if(str[j]==',')
        {
            flg=2;
        }
        else
        {
            p=(BTNode*)malloc(sizeof(BTNode));
            if(!p)
            {
                printf("申请空间失败!\n");
                return ;
            }
            p->data=str[j];
            p->lchild=NULL;
            p->rchild=NULL;
            if(!root)
            {
                root=p;
            }
            else
            {
                if(flg==1)
                    st[top]->lchild=p;
                if(flg==2)
                    st[top]->rchild=p;
            }
        }
        j++;
    }

    return ;
}
//求二叉树有多少个度为0的结点
int _SumLeaf(BTNode *root)
{
    int flg=0;
    int count=0;
    BTNode* queue[MAX];
    BTNode* p=NULL;
    int rear=-1,front=-1;

    if(!root)
        return -1;
    rear++;
    queue[rear]=root;
    while(rear!=front)
    {
        front++;
        p=queue[front];
        flg=0;
        if(p->lchild)
        {
            //进队
            rear++;
            queue[rear]=p->lchild;
            flg++;
        }
        if(p->rchild)
        {
            rear++;
            queue[rear]=p->rchild;
            flg++;
        }
        if(0==flg)
            count++;
    }

    return count;
}


void main()
{
    int i;
    BTNode *ROOT=NULL;
    CreatBT(ROOT,"A(B(D(,G)),C(E,F))");
    i=_SumLeaf(ROOT);
    printf("一共有%d个度为0的结点\n",i);
    //高度为4的满二叉树 
    CreatBT(ROOT,"A(B(D(H,I),E(J,K)),C(F(L,M),G(N,O)))");
    i=_SumLeaf(ROOT);
    printf("一共有%d个度为0的结点\n",i);
    return ;
}

 

posted @ 2013-12-23 19:28  乾卦  阅读(417)  评论(0编辑  收藏  举报