二叉树

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。

给定二叉树的根节点root,请返回所求距离。

import java.util.*;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class Tree {

    TreeNode max, min;
    int max_val = Integer.MIN_VALUE, min_val = Integer.MAX_VALUE;
    int max_deep = 0, min_deep = 0;

    List<TreeNode> list_max = new ArrayList<TreeNode>();
    List<TreeNode> list_min = new ArrayList<TreeNode>();
    boolean flag = false;

    public int getDis(TreeNode root) {
        findMaxAndMin(root, 0);
        findMaxRoute(root);
        flag = false;
        findMinRoute(root);

        int index = 0;
        for(; index<Math.min(list_max.size(), list_min.size()); index++)
            if(list_max.get(index) != list_min.get(index))
                break;

        return max_deep + min_deep - (index - 1)* 2;
    }

    public void findMaxAndMin(TreeNode root, int deep) {
        if(root == null) return;
        if(root.left == null && root.right == null && root.val > max_val) {
            max_val = root.val;
            max = root;
            max_deep = deep;
        }
        if(root.left == null && root.right == null && root.val < min_val) {
            min_val = root.val;
            min = root;
            min_deep = deep;
        }

        findMaxAndMin(root.left, deep + 1);
        findMaxAndMin(root.right, deep + 1);

    }

    public void findMaxRoute(TreeNode root) {
        if(root == null) return;
        if(root == max) {
            flag = true;
            return;
        }

        if(!flag) {
            list_max.add(root);
            findMaxRoute(root.left);
            //list_max.remove(root.left);
            if(!flag)
                findMaxRoute(root.right);
            //list_max.remove(root.right);
            if(!flag)
                list_max.remove(root);
        }
    }

    public void findMinRoute(TreeNode root) {
        if(root == null) return;
        if(root == min) {
            flag = true;
            return;
        }

        if(!flag) {
            list_min.add(root);
            findMinRoute(root.left);
            //list_max.remove(root.left);
            if(!flag)
                findMinRoute(root.right);
            //list_max.remove(root.right);
            if(!flag)
                list_min.remove(root);
        }
    }
}

思路比较简单,
(1)先遍历二叉树找到最大值和最小值的位置和深度,
(2)用dfs找到从root到最大最小节点的路径
(3)找到它们的最近ancestor及其深度
(4)计算得到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值