您的位置:首页 > 其它

微软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/22288669

3python版

'''
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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: