(续)寻找一棵树上最远的两个节点
2010-07-12 15:37
447 查看
续一篇这个题目的文章,是因为看到编程之美里面也讲到了这个问题。
若干周以前是在csdn上看到的,然后我用python写了个算法,很长很长,
基本是把所有叶子到根的路径找出来了,
然后做合并,看什么是最长的路径。
这样的做法是为了找出所有的节点究竟是什么,而至今我还没找到更好的办法。
这次编程之美里的问题简化了一点,只要求找出最大的路径的长度,不用找出究竟是哪个。
这样的话就可以比较简单的用递归去做了。
最大的路径是以下三个值的最大值:
1.左边分支的最大路径。
2.右边分支的最大路径。
3.左边的深度+右边的深度+2。
若干周以前是在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; } }
相关文章推荐
- 寻找一棵树上最远的两个节点
- 给定平面上的N个点,寻找距离最远的两个点
- 寻找两个相交链表的第一个公共节点的问题
- 寻找两个节点的最近公共祖先
- 求二叉树中距离最远的两个叶子节点的距离
- 《程序员面试金典》--寻找二叉树中两个节点的第一个公共祖先(三种情况)
- 二叉树问题——寻找二叉树中两个节点的最近公共祖先
- 寻找二叉树两个节点的最低公共祖先(LCA)
- 数据结构—判断两个链表是否相交,寻找两个链表的相交节点
- 【二叉树6】寻找二叉树中任意节点最远的距离
- 寻找两个单链表的第一个公共节点
- 判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)
- 寻找二叉树两个节点的最低公共祖先
- 二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
- [转] 寻找二叉树中两个节点的最近的公共祖先
- 寻找二叉树两个结点的最低共同父节点(2014京东笔试题)
- 寻找二叉树中两个节点的最近祖先
- 在二叉树中,距离最远的两个节点的距离
- 寻找二叉树两个节点的最低公共祖先
- 二叉树中相距最远的两个节点之间的距离