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

原创 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);
	}



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

[编程之美]求二叉树中节点的最大距离

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 书上的解法 ...
  • lalor
  • lalor
  • 2012年06月02日 21:37
  • 8795

二叉树系列——二叉树的最大距离(即相距最远的两个叶子节点,编程之美,百度面试题)

来自于编程之美3.8。 题目:如果我们把二叉树看做图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 如下图所示...
  • liuyi1207164339
  • liuyi1207164339
  • 2016年03月15日 21:23
  • 4467

在二叉树中,距离最远的两个节点的距离

在二叉树中,找到距离最远的两个节点的距离 在二叉树中,找到距离最远的两个节点的距离。在上面的二叉树中,最远的节点的距离是:4(路径是2-3-13-5-2)。 解决思路:递归。最远的两个节点,...
  • jiyanfeng1
  • jiyanfeng1
  • 2012年09月06日 14:11
  • 5623

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

问题定义 把二叉树看成一个图,父子节点之间的连线看成是双向的,定义“距离”为两个节点之间的边数。例如下图中最大距离为红线的条数为6. 分析 方法一、 typedef struct...
  • yangquanhui1991
  • yangquanhui1991
  • 2016年08月12日 21:33
  • 557

二叉树的任意两节点间的最大距离

1.问题定义 如果我们把二叉树看成一个图,父子结点之间的连线看成是双向的,我们姑且定义“距离”为两节点之间边的个数。 写一个程序求一棵二叉树中相距最远的两个结点之间的距离 2.解法 计算一个二叉树...
  • patkritLee
  • patkritLee
  • 2016年08月09日 15:02
  • 1613

二叉树中节点的最大距离(java)

定义二叉树中节点的距离为节点之间边的个数。    一个二叉树中节点的最大距离由三部分综合求得:一部分是左子树中节点的最大距离,另一部分是右子树中节点的最大距离,最后一部分是左边的最大深度加上右边的最大...
  • a925907195
  • a925907195
  • 2015年07月19日 22:56
  • 2283

第11题:求二叉树中节点的最大距离

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44984331 第11题:如果我们把二叉树看成一个图,父子节点之...
  • alading2009
  • alading2009
  • 2015年04月10日 20:25
  • 676

LeetCode—***寻找二叉树中任意两个节点之间的最大值Binary Tree Maximum Path Sum

Binary Tree Maximum Path Sum
  • xietingcandice
  • xietingcandice
  • 2014年08月27日 21:06
  • 613

第11 题 求二叉树中节点的最大距离...

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数。 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。 思路:     ...
  • Matrixlibing
  • Matrixlibing
  • 2012年07月22日 14:08
  • 495

《编程之美》——求二叉树中节点的最大距离(非递归)

这里给出书中扩展问题提出的非递归解法。就像书中总结的时候给出的叶先生博客中关于本题的解法,这里同样不需要在节点中嵌入nMaxLeft、nMaxRight等额外数据。 主要原理是基于非递归后续遍历二叉...
  • u010260440
  • u010260440
  • 2013年08月14日 16:48
  • 470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求二叉树中节点的最大距离
举报原因:
原因补充:

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