求二叉树中节点的最大距离

原创 2015年07月07日 22:10:06

编程之美中的一道题

编程之美中采用的解法是一种侵入式的

解法如下

struct NODE
{
    NODE* pLeft;        // 左子树
    NODE* pRight;       // 右子树
    int nMaxLeft;       // 左子树中的最长距离
    int nMaxRight;      // 右子树中的最长距离
    char chValue;       // 该节点的值
};
 
int nMaxLen = 0;
 
// 寻找树中最长的两段距离
void FindMaxLen(NODE* pRoot)
{
    // 遍历到叶子节点,返回
    if(pRoot == NULL)
    {
        return;
    }
 
    // 如果左子树为空,那么该节点的左边最长距离为0
    if(pRoot -> pLeft == NULL)
    {
        pRoot -> nMaxLeft = 0; 
    }
 
    // 如果右子树为空,那么该节点的右边最长距离为0
    if(pRoot -> pRight == NULL)
    {
        pRoot -> nMaxRight = 0;
    }
 
    // 如果左子树不为空,递归寻找左子树最长距离
    if(pRoot -> pLeft != NULL)
    {
        FindMaxLen(pRoot -> pLeft);
    }
 
    // 如果右子树不为空,递归寻找右子树最长距离
    if(pRoot -> pRight != NULL)
    {
        FindMaxLen(pRoot -> pRight);
    }
 
    // 计算左子树最长节点距离
    if(pRoot -> pLeft != NULL)
    {
        int nTempMax = 0;
        if(pRoot -> pLeft -> nMaxLeft > pRoot -> pLeft -> nMaxRight)
        {
            nTempMax = pRoot -> pLeft -> nMaxLeft;
        }
        else
        {
            nTempMax = pRoot -> pLeft -> nMaxRight;
        }
        pRoot -> nMaxLeft = nTempMax + 1;
    }
 
    // 计算右子树最长节点距离
    if(pRoot -> pRight != NULL)
    {
        int nTempMax = 0;
        if(pRoot -> pRight -> nMaxLeft > pRoot -> pRight -> nMaxRight)
        {
            nTempMax = pRoot -> pRight -> nMaxLeft;
        }
        else
        {
            nTempMax = pRoot -> pRight -> nMaxRight;
        }
        pRoot -> nMaxRight = nTempMax + 1;
    }
 
    // 更新最长距离
    if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen)
    {
        nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight;
    }
}


我在解决这个问题时,想到的另一个算法,判断一棵树是否是平衡二叉树,下面是我的解决方法,使用的php语言
	public function getMaxDistance($node,&$Max){
		
		if(null == $node){
			return 0;
		}
		
		$left = $this->getMaxDistance($node->lchild,$Max);
		$right = $this->getMaxDistance($node->rchild,$Max);
		
		if($Max < ($left+$right)){
			$Max = $left + $right;
		}
		
		return 1+($left>$right?$left:$right);
	}



版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

求二叉树中节点的最大距离

《编程之美》第3.8节:求二叉树中的最大距离 问题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们定义距离为两个节点之间的边数,求一棵二叉树中县局最远的两个节点之间的距离。 解法...

求二叉树中节点的最大距离

转自:http://hi.baidu.com/xiangzifengshi/blog/item/06081a1b4302a6c5a6866944.html 求二叉树中节点的最大距离 《编程之美》3...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

求二叉树中节点的最大距离

题目描述 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间的变数。 写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 输入要求 ...

微软面试100题之11题:求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数。 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。

《编程之美》读书笔记12: 3.8 求二叉树中节点的最大距离

问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。   实际上就是求树的直径。若...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)