首页 > 其他 > 详细

二叉树的深度

时间:2014-12-09 12:28:00      阅读:229      评论:0      收藏:0      [点我收藏+]

题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶子结点依次经过的结点形成一条路径,最长路径的长度为树的深度。二叉树的结点定义如下:

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

分析:二叉树的深度等于根结点的左子树和右子树之中深度最大的一个加1,明显这是一个递归过程。实现如下:

int TreeDepth(BinaryTreeNode* pRoot)
{
    if(pRoot==NULL)
        return 0;
        
    int nLeft=TreeDepth(pRoot->m_pLeft);
    int nRight=TreeDepth(pRoot->m_pRight);
    
    return (nLeft>nRight)?(nLeft+1):(nRight+1);
}

题目二:输入一个二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

分析:根据题目一的方案可以得到以下实现方式:

bool IsBalanced(BinaryTreeNode* pRoot)
{
    if(pRoot==NULL)
        return true;
        
    int left=TreeDepth(pRoot->m_pLeft);
    int right=TreeDepth(pRoot->m_pRight);
    int diff=left=right;
    if(diff>1||diff<-1)
        return false;
        
    return IsBalanced(pRoot->m_pLeft)&&IsBalanced(pRoot->m_pRight);
}

上述实现虽然简单,但是注意到由于每个结点会被重复遍历多次,这种思路的时间效率不高。我们在遍历的时候记录深度就可以了。实现如下:

bool IsBalanced(BinaryTreeNode* pRoot,int* pDepth)
{
    if(pRoot==NULL)
    {
        *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;
}

bool IsBalanced(BinaryTreeNode* pRoot)
{
    int depth=0;
    return IsBalanced(pRoot,&depth);
}


本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1587778

二叉树的深度

原文:http://secondscript.blog.51cto.com/9370042/1587778

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!