码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的深度

时间:2014-12-09 12:30:30      阅读:192      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!