"""# Definition for a Node.class Node: def __init__(self, val=None, children=None): self.val = val self.children = children if children is not None else []"""classSolution:defdiameter(self,root:'Node')->int:""" :type root: 'Node' :rtype: int """defdfs(root):ifrootisNone:return0nonlocalansm1=m2=0forchildinroot.children:t=dfs(child)ift>m1:m2,m1=m1,telift>m2:m2=tans=max(ans,m1+m2)return1+m1ans=0dfs(root)returnans
/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() { children = new ArrayList<Node>(); } public Node(int _val) { val = _val; children = new ArrayList<Node>(); } public Node(int _val,ArrayList<Node> _children) { val = _val; children = _children; }};*/classSolution{privateintans;publicintdiameter(Noderoot){ans=0;dfs(root);returnans;}privateintdfs(Noderoot){if(root==null){return0;}intm1=0,m2=0;for(Nodechild:root.children){intt=dfs(child);if(t>m1){m2=m1;m1=t;}elseif(t>m2){m2=t;}}ans=Math.max(ans,m1+m2);return1+m1;}}
/** * Definition for a Node. * type Node struct { * Val int * Children []*Node * } */funcdiameter(root*Node)int{ans:=0vardfsfunc(root*Node)intdfs=func(root*Node)int{ifroot==nil{return0}m1,m2:=0,0for_,child:=rangeroot.Children{t:=dfs(child)ift>m1{m2,m1=m1,t}elseift>m2{m2=t}}ans=max(ans,m1+m2)return1+m1}dfs(root)returnans}
"""# Definition for a Node.class Node: def __init__(self, val=None, children=None): self.val = val self.children = children if children is not None else []"""classSolution:defdiameter(self,root:'Node')->int:""" :type root: 'Node' :rtype: int """defbuild(root):nonlocaldifrootisNone:returnforchildinroot.children:d[root].add(child)d[child].add(root)build(child)defdfs(u,t):nonlocalans,vis,d,nextifuinvis:returnvis.add(u)forvind[u]:dfs(v,t+1)ifans<t:ans=tnext=ud=defaultdict(set)vis=set()build(root)ans=0next=Nonedfs(root,0)vis.clear()dfs(next,0)returnans
/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() { children = new ArrayList<Node>(); } public Node(int _val) { val = _val; children = new ArrayList<Node>(); } public Node(int _val,ArrayList<Node> _children) { val = _val; children = _children; }};*/classSolution{privateMap<Node,Set<Node>>g;privateSet<Node>vis;privateNodenext;privateintans;publicintdiameter(Noderoot){g=newHashMap<>();build(root);vis=newHashSet<>();next=root;ans=0;dfs(next,0);vis.clear();dfs(next,0);returnans;}privatevoiddfs(Nodeu,intt){if(vis.contains(u)){return;}vis.add(u);if(t>ans){ans=t;next=u;}if(g.containsKey(u)){for(Nodev:g.get(u)){dfs(v,t+1);}}}privatevoidbuild(Noderoot){if(root==null){return;}for(Nodechild:root.children){g.computeIfAbsent(root,k->newHashSet<>()).add(child);g.computeIfAbsent(child,k->newHashSet<>()).add(root);build(child);}}}
/** * Definition for a Node. * type Node struct { * Val int * Children []*Node * } */funcdiameter(root*Node)int{g:=make(map[*Node][]*Node)vis:=make(map[*Node]bool)next:=rootans:=0varbuildfunc(root*Node)build=func(root*Node){ifroot==nil{return}for_,child:=rangeroot.Children{g[root]=append(g[root],child)g[child]=append(g[child],root)build(child)}}build(root)vardfsfunc(u*Node,tint)dfs=func(u*Node,tint){ifvis[u]{return}vis[u]=trueift>ans{ans=tnext=u}ifvs,ok:=g[u];ok{for_,v:=rangevs{dfs(v,t+1)}}}dfs(next,0)vis=make(map[*Node]bool)dfs(next,0)returnans}
"""# Definition for a Node.class Node: def __init__(self, val=None, children=None): self.val = val self.children = children if children is not None else []"""classSolution:defdiameter(self,root:'Node')->int:""" :type root: 'Node' :rtype: int """ifrootisNone:return0ans=0height={}stk=[(root,0)]whilestk:node,state=stk.pop()ifstate==0:stk.append((node,1))forchildinreversed(node.children):ifchildisnotNone:stk.append((child,0))else:m1=m2=0forchildinnode.children:t=height.get(child,0)ift>m1:m2,m1=m1,telift>m2:m2=tans=max(ans,m1+m2)height[node]=m1+1returnans
/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() { children = new ArrayList<Node>(); } public Node(int _val) { val = _val; children = new ArrayList<Node>(); } public Node(int _val,ArrayList<Node> _children) { val = _val; children = _children; }};*/classSolution{publicintdiameter(Noderoot){if(root==null){return0;}intans=0;Map<Node,Integer>height=newHashMap<>();Deque<Node>nodes=newArrayDeque<>();Deque<Integer>states=newArrayDeque<>();nodes.push(root);states.push(0);while(!nodes.isEmpty()){Nodenode=nodes.pop();intstate=states.pop();if(state==0){nodes.push(node);states.push(1);List<Node>children=node.children;for(inti=children.size()-1;i>=0;--i){Nodechild=children.get(i);if(child!=null){nodes.push(child);states.push(0);}}}else{intm1=0,m2=0;for(Nodechild:node.children){intt=height.getOrDefault(child,0);if(t>m1){m2=m1;m1=t;}elseif(t>m2){m2=t;}}ans=Math.max(ans,m1+m2);height.put(node,m1+1);}}returnans;}}
/** * Definition for a Node. * type Node struct { * Val int * Children []*Node * } */funcdiameter(root*Node)int{ifroot==nil{return0}typeframestruct{node*Nodestateint}ans:=0height:=map[*Node]int{}stk:=[]frame{{root,0}}forlen(stk)>0{f:=stk[len(stk)-1]stk=stk[:len(stk)-1]iff.state==0{stk=append(stk,frame{f.node,1})children:=f.node.Childrenfori:=len(children)-1;i>=0;i--{ifchildren[i]!=nil{stk=append(stk,frame{children[i],0})}}}else{m1,m2:=0,0for_,child:=rangef.node.Children{t:=height[child]ift>m1{m2,m1=m1,t}elseift>m2{m2=t}}ans=max(ans,m1+m2)height[f.node]=m1+1}}returnans}
"""# Definition for a Node.class Node: def __init__(self, val=None, children=None): self.val = val self.children = children if children is not None else []"""classSolution:defdiameter(self,root:'Node')->int:""" :type root: 'Node' :rtype: int """ifrootisNone:return0g=defaultdict(list)seen={root}stk=[root]whilestk:u=stk.pop()forchildinu.children:ifchildisNoneorchildinseen:continueseen.add(child)g[u].append(child)g[child].append(u)stk.append(child)deffarthest(start):vis={start}walk=[(start,0)]best,node=0,startwhilewalk:u,t=walk.pop()ift>best:best,node=t,uforving[u]:ifvnotinvis:vis.add(v)walk.append((v,t+1))returnbest,node_,nxt=farthest(root)ans,_=farthest(nxt)returnans
/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() { children = new ArrayList<Node>(); } public Node(int _val) { val = _val; children = new ArrayList<Node>(); } public Node(int _val,ArrayList<Node> _children) { val = _val; children = _children; }};*/classSolution{publicintdiameter(Noderoot){if(root==null){return0;}Map<Node,List<Node>>g=newHashMap<>();Set<Node>seen=newHashSet<>();Deque<Node>stk=newArrayDeque<>();stk.push(root);seen.add(root);while(!stk.isEmpty()){Nodeu=stk.pop();for(Nodechild:u.children){if(child==null||!seen.add(child)){continue;}g.computeIfAbsent(u,k->newArrayList<>()).add(child);g.computeIfAbsent(child,k->newArrayList<>()).add(u);stk.push(child);}}Node[]nxt=newNode[]{root};farthest(g,root,nxt);returnfarthest(g,nxt[0],nxt);}privateintfarthest(Map<Node,List<Node>>g,Nodestart,Node[]nxt){Set<Node>vis=newHashSet<>();Deque<Node>nodes=newArrayDeque<>();Deque<Integer>dist=newArrayDeque<>();nodes.push(start);dist.push(0);vis.add(start);intbest=0;nxt[0]=start;while(!nodes.isEmpty()){Nodeu=nodes.pop();intt=dist.pop();if(t>best){best=t;nxt[0]=u;}List<Node>vs=g.get(u);if(vs==null){continue;}for(Nodev:vs){if(vis.add(v)){nodes.push(v);dist.push(t+1);}}}returnbest;}}
/** * Definition for a Node. * type Node struct { * Val int * Children []*Node * } */funcdiameter(root*Node)int{ifroot==nil{return0}g:=map[*Node][]*Node{}seen:=map[*Node]bool{root:true}stk:=[]*Node{root}forlen(stk)>0{u:=stk[len(stk)-1]stk=stk[:len(stk)-1]for_,child:=rangeu.Children{ifchild==nil||seen[child]{continue}seen[child]=trueg[u]=append(g[u],child)g[child]=append(g[child],u)stk=append(stk,child)}}farthest:=func(start*Node)(int,*Node){typeframestruct{node*Nodedistint}vis:=map[*Node]bool{start:true}walk:=[]frame{{start,0}}best,node:=0,startforlen(walk)>0{f:=walk[len(walk)-1]walk=walk[:len(walk)-1]iff.dist>best{best,node=f.dist,f.node}for_,v:=rangeg[f.node]{if!vis[v]{vis[v]=truewalk=append(walk,frame{v,f.dist+1})}}}returnbest,node}_,nxt:=farthest(root)ans,_:=farthest(nxt)returnans}