微软100题第11题(求二叉树中节点的最大距离)
2017-01-17 17:10
459 查看
1scala版本
package ms import scala.util.Random /** * 第11题(树) 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数。 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。 * */ class RandomBinaryTree{ var root:RandomNode=null; def init(data:List[Int]){ if(data.length>0){ root=RandomNode(data(0)) if(data.length>1){ for(i<-1 until data.length){ insertRandomNode(root,data(i)) } } } } private[this] def insertRandomNode(parent:RandomNode,value:Int){ var b:Boolean= Random.nextBoolean(); if(b){ if(parent.left==null){ parent.left=RandomNode(value) }else{ insertRandomNode(parent.left, value) } }else{ if(parent.right==null){ parent.right=RandomNode(value) }else{ insertRandomNode(parent.right, value) } } } def computeMaxDepth(parent:RandomNode):Unit={ if(parent.left==null){ parent.leftDepth=0; } if(parent.right==null){ parent.rightDepth=0; } if(parent.left!=null){ computeMaxDepth(parent.left) parent.leftDepth=math.max(parent.left.leftDepth,parent.left.rightDepth)+1 } if(parent.right!=null){ computeMaxDepth(parent.right) parent.rightDepth=math.max(parent.right.leftDepth, parent.right.rightDepth)+1 } } def computeMaxLongDepth(parent:RandomNode):Int={ if(parent==null){ return 0 } val maxLongDepth=parent.leftDepth+parent.rightDepth; val leftmax=computeMaxLongDepth(parent.left) val rightmax=computeMaxLongDepth(parent.right) return math.max(maxLongDepth, math.max(leftmax, rightmax)) } } case class RandomNode(var value:Int,var left:RandomNode=null,var right:RandomNode=null,var leftDepth:Int= -1,var rightDepth:Int= -1 ) object MicroSoft011 { def main(args: Array[String]): Unit = { val data=List(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) val tree=new RandomBinaryTree(); tree.init(data) tree.computeMaxDepth(tree.root) println(tree.computeMaxLongDepth(tree.root)); println() } }
2java版
http://blog.csdn.net/hxpjava1/article/details/222886693python版
''' Created on 2017-1-18 @author: admin /** * 第11题(树) 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数。 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。 * */ ''' from _overlapped import NULL import sys import random class RandomBinaryTree: def __init__(self,data): if len(data)>0: self.root=RandomNode(data[0]) if len(data)>1: for i in range(1,len(data)): self._insertNode(self.root,data[i]) def _insertNode(self,parent,value): direction=random.choice([True,False]) if direction: if parent.left==NULL: parent.left=RandomNode(value) else: self._insertNode(parent.left, value) else: if parent.right==NULL: parent.right=RandomNode(value) else: self._insertNode(parent.right, value) def computeDepth(self,parent): if parent.left==NULL: parent.leftDepth=0 if parent.right==NULL: parent.rightDepth=0 if parent.left!=NULL: self.computeDepth(parent.left) parent.leftDepth=max([parent.left.rightDepth,parent.left.leftDepth])+1 if parent.right!=NULL: self.computeDepth(parent.right) parent.rightDepth=max([parent.right.rightDepth,parent.right.leftDepth])+1 def computeMaxDepth(self,parent): if parent==NULL: return 0 depth=parent.leftDepth+parent.rightDepth+1 leftmax=self.computeMaxDepth(parent.left) rightmax=self.computeMaxDepth(parent.right) return max([depth,leftmax,rightmax]) class RandomNode: def __init__(self,value): self.value=value self.left=NULL self.right=NULL self.leftDepth=-sys.maxsize self.rightDepth=-sys.maxsize if __name__ == '__main__': data=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] tree=RandomBinaryTree(data) tree.computeDepth(tree.root) print(tree.computeMaxDepth(tree.root))
相关文章推荐
- 微软面试100题之第11题 求二叉树中节点的最大距离
- 微软等数据结构+算法面试100题(38)-- 二叉树中任意两个节点间的最大距离
- 微软面试100题之11题:求二叉树中节点的最大距离
- 微软100题(11) 二叉树中节点的最大距离
- 【微软100题】求二叉树中节点的最大距离
- July 微软面试100题 第11题 求二叉树的最大距离
- 微软面试100题系列---求二叉树中节点的最大距离
- 第11 题 求二叉树中节点的最大距离...
- 【从零单排之微软面试100题系列】11之二叉树中结点的最大距离
- 9. 微软面试题:求二叉树中节点间最大距离
- IT公司100题-11-求二叉树中节点的最大距离
- 求二叉树中结点的最大距离 【微软面试100题 第十一题】
- 微软面试百题010——二叉树节点最大距离
- 微软算法100道题-----求二叉树中节点的最大距离
- 面试100题:11.求二叉树中节点的最大距离
- 面试100题:11.求二叉树中节点的最大距离
- 【100题】第三十九题 二叉树任意两个节点间最大距离和有向图割点
- 【100题】第十一题(二叉树中节点的最大距离)
- 【100题】第十一题(二叉树中节点的最大距离)
- 求二叉树中结点的最大距离 【微软面试100题 第十一题】