二叉树的深度 ----《剑指offer》面试题39

题目

输入一棵二叉树的根结点,求该树的深度。

思路

如果一棵树只有一个结点,它的深度为1。如果根结点只有左子树,那么树的深度应该是该其左子树的深度加1;同样如果根结点只有右子树而没有左子树,那么树的深度是其右子树的深度加1。如果既有右子树又有左子树,那该树的深度就是其左、右子树的深度较大值再加1。

题目

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。

思路

在遍历树的每个结点的时候,先得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二叉树。遍历时,采用后序遍历的方式可以减少重复判断左右子树的次数。

代码

#include <iostream>

using namespace std;

struct BinaryTreeNode
{
    int                 m_nValue;
    BinaryTreeNode*     m_pLeft;
    BinaryTreeNode*     m_pRight;
};

int TreeDepth(BinaryTreeNode* pRoot)
{
    if (pRoot == nullptr)
        return 0;

    int nLeft = TreeDepth(pRoot->m_pLeft);
    int nRight = TreeDepth(pRoot->m_pRight);

    return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}

bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth)
{
    if (pRoot == nullptr)
    {
        *pDepth = 0;
        return true;
    }

    int left, right;
    if (IsBalanced(pRoot->m_pLeft, &left)
        && IsBalanced(pRoot->m_pRight, &right))
    {
        int diff = left - right;
        if (diff <= 1 && diff >= -1)
        {
            *pDepth = 1 + (left > right ? left : right);
            return true;
        }
    }

    return false;
}

int main()
{
    BinaryTreeNode n8{8, nullptr, nullptr};
    BinaryTreeNode n7{7, nullptr, nullptr};
    BinaryTreeNode n6{6, nullptr, nullptr};
    BinaryTreeNode n5{5, nullptr, nullptr};
    BinaryTreeNode n4{4, &n8, nullptr};
    BinaryTreeNode n3{3, &n6, &n7};
    BinaryTreeNode n2{2, &n4, &n5};
    BinaryTreeNode n1{1, &n2, &n3};

    int depth = 0;
    cout << "The depth is: " << TreeDepth(&n1) << endl
        << "Is a Balance Tree ? : " << IsBalanced(&n1, &depth) << endl;


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值