小白都能看懂的二叉树基本操作(四):平衡二叉树、完全二叉树的判断

二叉树常见题目种类繁多,但是万变不离其宗。

二叉树,以及其他变种树的操作,确实在笔试面试中挺常见。这也属于典型的“面试造航母,工作拧螺丝”。不过熟悉掌握二叉树,对工作以及逻辑思维还是很有帮助的。

今天看一下平衡二叉树和完全二叉树的判断。

一、平衡二叉树

       平衡二叉树是指,每一个父节点的左右子树高度差的绝对值小于等于1,这样的二叉树叫平衡二叉树。

       请出我们的演员树:

图片

       如上图,这棵树就是一颗平衡二叉树。应为每个节点的左右子树的高度差的绝对值都小于等于1。

       思路已经清晰了,对比每个父节点的左右子树高度,当所有节点都满足高度差在1以内的时候,证明此二叉树为平衡二叉树。

代码:

// 是否是平衡二叉树int IsBalanceTreeOnce(Node *pTree,int &iHeight){    if(!pTree)    {           iHeight = 0;        return 1;    }   
    int iHeightLeft = 0;    int iHeightRight = 0;    int iBalanceLeft = IsBalanceTreeOnce(pTree->left, iHeightLeft);    int iBalanceRight = IsBalanceTreeOnce(pTree->right, iHeightRight);    iHeight = (iHeightLeft >= iHeightRight ? iHeightLeft : iHeightRight) + 1;    if (0 == iBalanceLeft || 0 == iBalanceRight)        return 0;
    int iDiff = iBalanceLeft - iBalanceRight;    if (iDiff > 1 || iDiff < -1)         return 0;    else        return 1;}int IsBalanceTree(Node *pTree){    int iHeight = 0;    return IsBalanceTreeOnce(pTree, iHeight);}

二、完全二叉树

       一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

       如下,为完全二叉树

图片

        思路:一层一层比较,一但出现NULL之后,之后不能再存在非空节点,这样即可认为是完全二叉树。

        因此可以利用层序遍历算法,层序遍历算法可以参考前一篇文章:

树的层序遍历

代码:​​​​​​​

// 是否是完全二叉树int IsCompleteTree(Node *pTree){    if(!pTree)        return 1;        std::list<Node *> node_list;    node_list.push_back(pTree);    bool bFindNull = false;    while(!node_list.empty())    {           Node *pNode = node_list.front();        node_list.pop_front();        if(!pNode)        {            bFindNull = true;            continue;        }        else if(bFindNull)        {            return 0;        }            node_list.push_back(pNode->left);        node_list.push_back(pNode->right);    }       return 1;}

欢迎关注我的个人公众号【头发头发等等我】

最后,点赞再看支持一下~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值