左孩子右兄弟

左孩子右兄弟 - 蓝桥云课 (lanqiao.cn)

这个题讲解一下思路。

看图

把样例转为二叉树:

我们可以发现所谓左孩子右兄弟就是说把一个节点的所有孩子节点中选取一个作为左子节点,这个节点的剩余孩子节点依次链接在这个左孩子节点的右边,直到某个节点有孩子节点再把它挂在左边。这就是左孩子右兄弟。为了从让二叉树的高度最大,我们使得根节点1的带有最多孩子节点的某个孩子节点在最下部。

而我们解答题目的关键就是计算根节点有几个孩子,根节点孩子的数量同时加上以这些孩子为根节点的子树的最大深度。以此一层一层类推进行递归处理。



import java.awt.PageAttributes.OriginType;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.math.MathContext;
import java.security.PublicKey;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

import javax.management.relation.InvalidRelationTypeException;
public class Main {	
  public static void main(String[] args) throws NumberFormatException, IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br.readLine().split(" ");
int a=Integer.parseInt(aStrings[0]);
int b;
for(b=1;b<=a+1;b++) {
	al1[b]=new ArrayList<>();
}
for(b=2;b<=a;b++) {
	String[] bStrings=br.readLine().split(" ");
	int c=Integer.parseInt(bStrings[0]);
	al1[c].add(b);//根节点为c的节点存储了一个子节点b
}
System.out.println(dfs(1));
}
  public static int aa=100009;
  
  public static ArrayList<Integer>[] al1=new ArrayList[aa];//数组编号代表着根节点编号
  public static int dfs(int a) {
	  int b;
	  int count=0;//由于只有根节点1默认为树的高度为0.所以以孩子节点的子数的高度在只有孩子节点时也为0
	  int c=al1[a].size();
	  for(b=0;b<c;b++) {
		  count=Math.max(count, dfs(al1[a].get(b)));
	  }
	  return count+al1[a].size();
  }
}

  
  
  
  


  
  
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值