根据父子关系建立二叉树

题目:

  • 给定这棵树上所有的父子关系,求这棵树的高度。

样例:

5
0 1
0 2
1 3
1 4

思路:

  • 将所有的节点保存在 HashMap 结构中,并根据节点之间的关系,建立二叉树。

代码:

import java.util.*;

//树的节点
class Node{
    int val;
    Node parent;
    Node left;
    Node right;
    Node(int val){
        this.val = val;
    }
}

public class Main{

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()){
            int n = in.nextInt();
            if(n==0 || n==1){
                System.out.println(n);
                continue;
            }

            int[][] nums = new int[n-1][2];
            for(int i=0; i<n-1; i++){
                Integer i1 = in.nextInt();
                Integer i2 = in.nextInt();
                nums[i][0] = i1;
                nums[i][1] = i2;                
            }
            //=========================建立树的过程=========================
            //将所有的节点保存在 Map 结构里面
            HashMap<Integer, Node> map = new HashMap<Integer, Node>();
            //遍历关系对,建立节点之间的联系
            for(int i=0; i<n-1; i++){
                //如果原来没有该节点,则建立新节点
                if(!map.containsKey(nums[i][0])){
                    Node node = new Node(nums[i][0]);
                    map.put(nums[i][0], node);
                }
                if(!map.containsKey(nums[i][1])){
                    Node node = new Node(nums[i][1]);
                    map.put(nums[i][1], node);
                }
                //建立节点之间的联系
                Node node0 = map.get(nums[i][0]);
                Node node1 = map.get(nums[i][1]);

                node1.parent = node0;   //注意此处要保存父节点
                if(node0.left==null)
                    node0.left = node1;
                else
                    node0.right = node1;
            }           
            //找出根节点:没有父节点的,即为根节点,得到建立后的树
            Node head = null;
            for(int i=0; i<n; i++){
                Node tempnode = map.get(i);
                if(tempnode.parent == null){
                    head = tempnode;
                    break;
                }
            }
            //=========================树建立完成=========================

            //根据树,采用递归算法,得到树的高度
            int result = MyFunction(head);
            System.out.println(result); 
        }       
    }

    //计算树的高度
    public static int MyFunction(Node head){        
        if(head==null)
            return 0;

        if(head.left == null)
            return MyFunction(head.right)+1;
        else if(head.right == null)
            return MyFunction(head.left)+1;     
        else
            return Math.max(MyFunction(head.left), MyFunction(head.right))+1;       
    }


}

参考:
题目来源: http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3329&konwledgeId=155

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值