2018.5.26(求完全二叉树的结点个数)

完全二叉树:
一棵树去除掉最大阶层后为一满二叉树,且阶层最大那层的结点均向左靠齐,则该二叉树为完全二叉树;
这里写图片描述

求完全二叉树的结点个数要求时间复杂度低于O(n)

思路剖析:
调用递归解决问题,先求出当前树的深度,在判断当前根结点的左右子树哪个为满二叉树,如果左二叉树为满二叉树,调用递归函数Is_FBT(head->right,total_node+pow(2,depth));反之,调用Is_FBT(head->left,total_node+pow(2,depth-1));

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;

class Tree
{
public:
    int data;
    Tree *left,*right;
    Tree(int value);
};

Tree::Tree(int value)
{
    data=value;
    left=NULL;
    right=NULL;
}

int Depth(Tree *head)
{
    Tree *new_point=head;

    int depth=0;
    while(new_point!=NULL)
    {
        depth++;

        new_point=new_point->left;
    }

    return depth;
}

int Is_FBT(Tree *head,int total_node)
{
    if(head->right==NULL&&head->left==NULL)
        return total_node+1;
    if(head->right==NULL)
        return total_node+2;
    if(head->left==NULL)
        return total_node+1;

    int depth=Depth(head)-1;
    int d=depth;
    Tree *new_point=head->right;

    while(--d&&new_point!=NULL)
        new_point=new_point->left;

    if(d==0)//如果d==0说明左子树为满二叉树,下一次递归当前根节点的右孩子;
        Is_FBT(head->right,total_node+(1<<depth));
    else//如果b!=0,说明右子树为满二叉树,且层数为depth-1,下一次递归当前根节点的左孩子;
        Is_FBT(head->left,total_node+(1<<(depth-1)));
}
int main()
{
    Tree *root=new Tree(1);
    root->left=new Tree(2);
    root->right=new Tree(3);

    int sum=Is_FBT(root,0);

    printf("The total_node of this tree is:\n");
    cout<<sum<<endl;

    delete root;
    return 0;
}

//坑~~~~~
    /*while(--d&&new_point!=NULL)//如果改成d--,当前树下,跳出循环后d=-1;
        new_point=new_point->left;*/

    /*int a1=3;
    while(--a1);
    printf("a=%d\n",a1);
    int a2=3;
    while(a2--);
    printf("a2=%d\n",a2);*/
    //输出结果a1=0,a2=-1;
    //注意区分while(a--)和while(--a)的差别;

这里写图片描述
如果当前树为此种状态:
当前树深度为depth=3,定义变量right_depth为右子树深度,当right_depth=depth时,说明左子树为满二叉树,右图可知以2为父结点,4,5为子树的数为满二叉树,根据满二叉树的结点计算公式,此满二叉树共有2^2-1个结点,再加上根节点,共有2^2个结点,调用递归函数Is_FBT(head->right,total_node+pow(2,depth));接着递归调用,执行下一状态;
直到满足递归结束条件

1、 1.下列关于m阶B树的说法错误的是( )。 A、 根结点至多有m棵子树 B、 所有叶子都在同一层次上 C、 非叶子结点至少有m/2 (m为偶数)或m/2+1(m为奇数)棵子树 D、 根结点中的数据是有序的 2、 2.下面关于B和B+树的叙述中,不正确的是( )。 A、 B树和B+树都是平衡的多叉树 B、 B树和B+树都可用于文件的索引结构 C、 B树和B+树都能有效地支持顺序查找 D、 B树和B+树都能有效地支持随机查找 3、 3.【2009年第8题】下列叙述中,不符合m阶B树定义要的是( )。 A、 根结点最多有m棵子树 B、 所有的叶子结点都在同一层上 C、 各结点内关键字均升序或降序排列 D、 叶子结点之间通过指针链接 4、 4.【2010年第9题】已知一个长度为16的顺序表L,其元素按关键字有序排列,若采用折半查找法查找一个不存在的元素,则比较次数最多的是( )。 A、 4.0 B、 5.0 C、 6.0 D、 7.0 55.【2014年第8题】用散列方法处理冲突(碰撞)时可能出现聚集(堆积)现象,下列选项中,会受堆积现象直接影响的是( )。 A、 存储效率 B、 散列函数 C、 装填(装载)因子 D、 平均查找长度 6、 6.【2014年第9题】在一棵具有15个关键字的4阶B树中,含关键字的结点个数最多是( )。 A、 5.0 B、 6.0 C、 10.0 D、 15.0 7、 7.【2015年第4题】现有一棵无重复关键字的平衡二叉树(AVL树),对其进行中序遍历可得到一个降序序列。下列关于该平衡二叉树的叙述中,正确的是( )。 A、 根结点的度一定为2 B、 树中最小元素一定是叶子结点 C、 最后插入的元素一定是叶子结点 D、 树中最大元素一定无左子树 8、 8.【2016年第10题】B+树不同于B树的特点之一是( )。 A、 能支持顺序查找 B、 结点中含有关键字 C、 根结点至少有两个分支 D、 所有叶子结点都在同一层上 9、 9.【2017年第9题】下列应用中,适合使用B+树的是( )。 A、 编译器中的词法分析 B、 关系数据库系统中的索引 C、 网络中的路由表快速查找 D、 操作系统的磁盘空闲块管理 10、 10.【2018年第8题】高度为5的3阶B-树含有的关键字个数至少是( )。 A、 15.0 B、 31.0 C、 62.0 D、 242.0
04-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值