二叉树判定问题和统计问题

二叉树判定问题

1.判定是否为二叉排序树

//1.判定是否为二叉排序树
//思想:对于一个二叉排序树进行先序遍历得到的是一个递增的序列,故每个结点都会大于其前驱结点的内容
int prev=0;
int flag=1;//表示是二叉排序树
void Inorder(BiTnode *T){
    if(T!=NULL){
        Inorder(T->lchild);
        if(T->data<prev){
            flag=0;
        }
        prev=T->data;
        Inorder(T->rchild);
    }
}

2.判定是否为完全二叉树

//2.判定是否为完全二叉树
//思想:对于完全二叉树层序遍历,如果某一个结点为空,判断其后面的结点是否存在空结点,如果存在非空结点则说明不是完全二叉树
bool isComplete(BiTnode *T){
    queue<BiTnode> que;
    if(T==NULL)return true;
    que.push(T);
    while(!que.empty()){
        bnode p=que.front();que.pop();
        if(p!=NULL){
            que.push(p->lchild);
            que.push(p->rchild);
        }
        else{
            while(!que.empty()){
                bnode p=que,front();que.pop();
                if(p==NULL)return false;
            }
        }
    }
}

3.判断二叉树是否为平衡二叉树

//3.判断二叉树是否为平衡二叉树
//思想:如果一个结点的左右子树的平衡因子之差的绝对值大于1,则说明该二叉树不平衡
int flag=1;
int check(BiNode *T){
    int l,r;
    if(T==NULL)return 0;
    if(T!=NULL){
        l=check(T->lchild);
        r=check(T->rchild);
        if(abs(l-r)>1)
            flag=0;
        if(l>=r)
            return l+1;
        else
            return r+1;
    }
}

二叉树统计问题

1.统计二叉树的结点个数

//1.统计二叉树的结点个数
int count(Binode *T){
    int a,b;
    if(T==NULL)return 0;
    else{
        a=count(T->lchild);
        b=count(T->rchild);
        return a+b+1;
    }
}

2.统计叶子结点的个数

//2.统计叶子结点的个数
int count(Binode *T){
    int a,b;
    if(T==NULL)return 0;
    else if(T->lchild==NULL&&T->rchild==NULL) return 1;
    else{
        a=count(T->lchild);
        b=count(T->rchild);
        return a+b;
    }
}

3.求二叉树单分支结点的个数

//3.求二叉树单分支结点的个数
int count(Binode *T){
    int a,b;
    if(T==NULL)return 0;
    else if((T->lchild!=NULL&&T->rchild==NULL)||(T->lchild==NULL&&T->rchild!=NULL)){
        a=count(T->lchild);
        b=count(T->rchild);
        return a+b+1;
    }
    else{
        a=count(T->lchild);
        b=count(T->rchild);
        return a+b;
    }
}

4.求二叉树双分支结点个数

//4.求二叉树双分支结点个数
int count(Binode *T){
    int a,b;
    if(T==NULL) return 0;
    else if(T->lchild!=NULL && T->rchild!=NULL){
        a=count(T->lchild);
        b=count(T->rchild);
        return a+b+1;
    }
    else{
        a=count(T->lchild);
        b=count(T->rchild);
        return a+b;
    }
}

5.计算各结点的子孙结点个数

//5.计算各结点的子孙结点个数
int count_child(Binode *T){
    int a,b;
    if(T==NULL) return 0;
    else{
        a=count_child(T->lchild);
        b=count_child(T->rchild);
        return a+b+1;
    }
}

void count(Binode *T){
    if(T!=NULL){
        cout<<"结点:"<<T->data<<" 的子孙结点个数是:"<<count_child(T)<<endl;
        count(T->lchild);
        count(T->rchild);
    }
}

6.求二叉树的高度

//6.求二叉树的高度
int high(Binode *T){
    if(T==NULL) return 0;
    else{
        return max(high(T->lchild),high(T->right))+1;
    }
}

7.二叉树宽度

//7.二叉树宽度
int get_width(Binode *root){
    if(root==NULL) return 0;
    int maxWidth=0;
    binode *que[100],*p;
    int rear=0,front=0,size;
    que[++rear]=root;
    while(rear!=front){
        size=rear-front;
        while(size>0){
            binode *temp=que[++front];
            size--;
            if(temp->lchild)
                que[++rear]=temp->lchild;
            if(temp->rchild)
                que[++rear]=temp->rchild;
        }
        maxWidth=maxWidth>(rear-front)?maxWidth:(rear-front)
    }
    return maxWidth;
}
posted @ 2021-10-28 11:04  CNPolaris  阅读(105)  评论(0编辑  收藏  举报