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

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



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

相关文章推荐

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

  • 2011年04月20日 21:28
  • 95KB
  • 下载

<仅是自己做笔记。。。系列-2>求二叉树中节点的最大距离

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

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

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

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

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

算法习题11:求二叉树中节点的最大距离

求二叉树中节点的最大距离... 如果我们把二叉树看成一个图, 父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数。 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。...
  • ylf13
  • ylf13
  • 2013年10月15日 10:34
  • 582

《编程之美: 求二叉树中节点的最大距离》的另一个解法(觉得比书上的好)

《编程之美: 求二叉树中节点的最大距离》的另一个解法 问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树...
  • hysfwjr
  • hysfwjr
  • 2013年05月24日 22:12
  • 476

编程之美: 求二叉树中节点的最大距离》的好解法

转自 :http://aclay.blog.163.com/blog/static/208468235201272392954636/ 昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟...

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

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

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

二叉树节点的结构体定义如下: struct BTreeNode {  ElemType elem;  // 当前节点元素  BTreeNode *left; // 左孩子结点  BTreeN...

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

递归求解,最大距离总是在一下两种情况产生 情况1:  最大路径经过root 这个例子中,最长路径经过root, 其距离等于左子树的高度 + 1 + 右子树的高度 + 1 在这...
  • kenby
  • kenby
  • 2011年09月26日 15:54
  • 963
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求二叉树中节点的最大距离
举报原因:
原因补充:

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