题解 | #找到二叉树中符合搜索二叉树条件的最大拓扑结构#
找到二叉树中符合搜索二叉树条件的最大拓扑结构
http://www.nowcoder.com/practice/e13bceaca5b14860b83cbcc4912c5d4a
package com.wyj.ch3;
import java.util.HashSet;
import java.util.Scanner;
/**
* @author: wyj
* @describe:
* @version:V01
* @date: 2021/7/26- 21:46
*/
public class h3a8 {
static class Node{
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
}
//
public static int bstTopoSize(Node head){
if(head==null){
return 0;
}
int max=maxTopo(head,head);
max=Math.max(bstTopoSize(head.left),max);
max=Math.max(bstTopoSize(head.right),max);
return max;
}
//搜索以h为头节点的最大拓扑结构
public static int maxTopo(Node h, Node n){
if(h!=null&& n!=null&& isBSTNode(h,n)){
return maxTopo(h,n.left)+maxTopo(h,n.right)+1;
}
return 0;
}
// 判断node n是否在以h为头节点的搜索二叉树上
public static boolean isBSTNode(Node h,Node n){
if(h==null){
return false;
}
if(h==n){
return true;
}
return isBSTNode(h.value> n.value? h.left:h.right, n);
}
/*创建无ID的树
in: 3 2
2 1 3
1 0 0
3 0 0
* */
public static Node createTree(Scanner in, int n){
int rootValue=in.nextInt();
Node root=new Node(rootValue);
HashSet<Node> set=new HashSet<Node>();
set.add(root);
//n行读取
for (int i = 0; i < n; i++) {
int fatherValue= in.nextInt();
int leftValue=in.nextInt();
int rightValue=in.nextInt();
//遍历
for (Node e:set){
//1、比较节点
if(e.value==fatherValue){
//2、建立左右节点
Node left= leftValue==0?null:new Node(leftValue);
Node right= rightValue==0?null:new Node(rightValue);
e.left=left;
e.right=right;
//3、放入节点
if(leftValue!=0){
set.add(left);
}
if(rightValue!=0){
set.add(right);
}
//4、remove
set.remove(e);
break;
}
}
}
return root;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
Node root= createTree(in,n);
int result= bstTopoSize(root);
System.out.println(result);
}
}
小天才公司福利 1190人发布
查看23道真题和解析