您的位置:首页 > 其它

(续)寻找一棵树上最远的两个节点

2010-07-12 15:37 447 查看
续一篇这个题目的文章,是因为看到编程之美里面也讲到了这个问题。

若干周以前是在csdn上看到的,然后我用python写了个算法,很长很长,

基本是把所有叶子到根的路径找出来了,

然后做合并,看什么是最长的路径。

这样的做法是为了找出所有的节点究竟是什么,而至今我还没找到更好的办法。

这次编程之美里的问题简化了一点,只要求找出最大的路径的长度,不用找出究竟是哪个。

这样的话就可以比较简单的用递归去做了。

最大的路径是以下三个值的最大值:

1.左边分支的最大路径。

2.右边分支的最大路径。

3.左边的深度+右边的深度+2。

using System;
using System.Collections.Generic;
using System.Text;
namespace ACM
{
public class FindLongestPathInTree
{
public void Run()
{
TreeNode root = InitialTree();
int pathLength = FindMaxPath(root);
Console.WriteLine(pathLength);
Console.ReadLine();
}
private int FindMaxPath(TreeNode root)
{
if (root == null)
return 0;
if (root.Left == null && root.Right == null)
return 0;
int maxLeft = 0;
int longestLeftNode = 0;
int maxRight = 0;
int longestRightNode = 0;
if (root.Left != null)
{
maxLeft = FindMaxPath(root.Left);
longestLeftNode = FindLongestNode(root.Left);
}
if (root.Right != null)
{
maxRight = FindMaxPath(root.Right);
longestRightNode = FindLongestNode(root.Right);
}
return FindMax(maxLeft, maxRight, longestLeftNode + longestRightNode + 2);
}
private int FindMax(int maxLeft, int maxRight, int sum)
{
if (maxRight > sum && maxRight > maxLeft) return maxRight;
else if (maxLeft > sum && maxLeft > maxRight) return maxLeft;
else return sum;
}
private int FindLongestNode(TreeNode treeNode)
{
if (treeNode == null)
return 0;
if (treeNode.Left == null && treeNode.Right == null)
return 0;
int left = FindLongestNode(treeNode.Left);
int right = FindLongestNode(treeNode.Right);
if (left > right)
return left+1;
else
return right+1;
}
private TreeNode InitialTree()
{
TreeNode root = new TreeNode(0);
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
TreeNode node8 = new TreeNode(8);
TreeNode node9 = new TreeNode(9);
root.Left = node1;
root.Right = node2;
node1.Left = node3;
node1.Right = node4;
node3.Left = node6;
node3.Right = node7;
node2.Right = node5;
node5.Left = node8;
node5.Right = node9;
return root;
}
}
class TreeNode
{
public TreeNode(int value)
{
this.Value = value;
}
public TreeNode Left;
public TreeNode Right;
public int Value;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: