zoukankan      html  css  js  c++  java
  • 设计一个算法,推断一个二叉树是否为全然二叉树

    思想:依据全然二叉树的定义,对全然二叉树依照从上到下、从左到右的层次遍历。应该满足一下两条要求:

    某节点没有左孩子。则一定无右孩子

    若某节点缺左或右孩子。则其全部后继一定无孩子

    若不满足上述不论什么一条。均不为全然二叉树。

    算法思路:採用层序遍历算法,用cm变量值表示迄今为止二叉树为全然二叉树(其初值为1。一旦发现不满足上述条件之中的一个,则置cm为0)。bj变量值表示迄今为止全部节点均有左右孩子(其初值为1),一旦发现一个节点没有左孩子或没有右孩子时置bj为0)。在遍历完成后返回cm的值。

    相应的算法例如以下:

    int CompBTNode(BTNode * b)

    {

    BTNode *Qu[MaxSize],*p; //定义一个队列,用于层次遍历

    int front=0,rear=0; //队头、队尾指针

    int cm=1;

    int bj=1;

    if(b!=NULL)

    {

    rear++;

    Qu[rear]=b; //进队

    while(front!=rear)

    {

    front++;

    p=Qu[front];

    if(p->lchild==NULL) //*p节点没有左孩子

    {

    bj=0;

    if(p->rchild!=NULL) //没有左孩子但有右孩子

    cm=0; //则不是全然二叉树

    }

    else //*p节点有左子树

    {

    if(bj==1) //迄今为止。全部节点均有左右孩子

    {

    rear++; //左孩子进队

    Qu[rear]=b->lchild;

    if(p->rchild==NULL) //*p有左孩子但没有右孩子

    bj=0;

    else

    {

    rear++; //右孩子进队

    Qu[rear]=p->rchild;

    }

    else //bj=0:迄今为止,已有节点缺孩子

    cm=0; //而此时*p节点有左孩子。违反(2)

    }

    }

    return cm;

    }

    return 1; //把空树当成特殊的全然二叉树

    }

  • 相关阅读:
    模拟测试48
    模拟测试47
    模拟测试46
    NOIP模拟测试29(A)
    NOIP模拟测试19
    NOIP模拟测试18(T3待更新)
    杂题
    noip模拟测试18 T2搜索
    noip模拟测试17 2019-08-11 考后反思
    noip模拟测试14 20190807 考试反思
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6917486.html
Copyright © 2011-2022 走看看