Java语言怎么计算一颗二叉树上最大读数的叶子节点是多少

Java语言怎么计算一颗二叉树上最大读数的叶子节点是多少?用Java语言实现怎么编写代码和输出的

运行效果如图:

img

代码如下 :

// 定义二叉树节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

public class Main {
    // 计算二叉树最大叶子节点的值
    static int getMaxLeafValue(TreeNode root) {
        if (root == null) {
            return Integer.MIN_VALUE;
        }

        // 当前节点为叶子节点
        if (root.left == null && root.right == null) {
            return root.val;
        }

        int leftMax = getMaxLeafValue(root.left); // 递归计算左子树最大叶子节点的值
        int rightMax = getMaxLeafValue(root.right); // 递归计算右子树最大叶子节点的值

        // 返回左右子树中较大的叶子节点值
        return Math.max(leftMax, rightMax);
    }

    public static void main(String[] args) {
        // 构造二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        // 计算最大叶子节点的值
        int maxLeafValue = getMaxLeafValue(root);

        // 输出结果
        System.out.println("最大叶子节点的值为:" + maxLeafValue);
    }
}


思路分析:
使用深度优先搜索算法

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

要计算一颗二叉树上最大叶子节点的值,你可以使用深度优先搜索(DFS)算法来遍历整个二叉树,并在遍历过程中更新最大值。以下是使用Java语言实现的代码示例:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

public class BinaryTreeMaxLeafValue {
    private static int maxLeafValue;

    public static int getMaxLeafValue(TreeNode root) {
        maxLeafValue = Integer.MIN_VALUE; // 初始化最大值为最小整数

        if (root != null) {
            dfs(root);
        }

        return maxLeafValue;
    }

    private static void dfs(TreeNode node) {
        if (node.left == null && node.right == null) { // 叶子节点
            maxLeafValue = Math.max(maxLeafValue, node.val); // 更新最大值
        }

        if (node.left != null) {
            dfs(node.left); // 递归遍历左子树
        }

        if (node.right != null) {
            dfs(node.right); // 递归遍历右子树
        }
    }

    public static void main(String[] args) {
        // 构建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.right.left = new TreeNode(6);
        root.right.right = new TreeNode(7);

        int maxLeafValue = getMaxLeafValue(root);
        System.out.println("最大叶子节点的值是: " + maxLeafValue);
    }
}

在上述代码中,我们首先定义了一个TreeNode类表示二叉树节点。然后,我们创建了一个BinaryTreeMaxLeafValue类,其中包含了一个静态方法getMaxLeafValue,用于计算二叉树上最大叶子节点的值。


getMaxLeafValue方法中,我们通过深度优先搜索遍历二叉树。如果当前节点是叶子节点(即没有左子节点和右子节点),我们将其值与当前最大值进行比较并更新最大值。


main方法中,我们构建了一个示例二叉树,并调用getMaxLeafValue方法来获取最大叶子节点的值,并将其打印输出。你可以根据自己的需要修改示例二叉树的结构。


该回答引用NewBing,仅供参考,不保证完全正确

您好,这是Bing。我可以帮您解答关于Java语言怎么计算一颗二叉树上最大读数的叶子节点是多少的问题。😊

根据我的搜索结果,有以下几种方法可以实现这个功能:

  • 一种方法是使用递归算法,分别求出左子树和右子树的最大读数的叶子节点,然后比较它们的值,返回较大的一个。这种方法的代码如下¹:
//定义一个二叉树结点类
class TreeNode {
    int val; //结点的值
    TreeNode left; //左孩子
    TreeNode right; //右孩子
    public TreeNode(int val) {
        this.val = val;
    }
}

//定义一个方法,求一颗二叉树上最大读数的叶子节点
public TreeNode maxLeaf(TreeNode root) {
    if (root == null) { //如果根结点为空,返回null
        return null;
    }
    if (root.left == null && root.right == null) { //如果根结点是叶子结点,返回自己
        return root;
    }
    //递归求左子树和右子树的最大读数的叶子节点
    TreeNode leftMax = maxLeaf(root.left);
    TreeNode rightMax = maxLeaf(root.right);
    //比较左右两个叶子结点的值,返回较大的一个
    if (leftMax == null) { //如果左子树为空,返回右子树的结果
        return rightMax;
    }
    if (rightMax == null) { //如果右子树为空,返回左子树的结果
        return leftMax;
    }
    if (leftMax.val > rightMax.val) { //如果左子树的值大于右子树的值,返回左子树的结果
        return leftMax;
    } else { //否则,返回右子树的结果
        return rightMax;
    }
}
  • 另一种方法是使用层序遍历算法,遍历每一层的结点,记录下每个叶子结点的值,并更新最大值和对应的结点。这种方法需要使用一个队列来存储每一层的结点,并且需要一个变量来保存最大值和对应的结点。这种方法的代码如下²:
//定义一个二叉树结点类
class TreeNode {
    int val; //结点的值
    TreeNode left; //左孩子
    TreeNode right; //右孩子
    public TreeNode(int val) {
        this.val = val;
    }
}

//定义一个方法,求一颗二叉树上最大读数的叶子节点
public TreeNode maxLeaf(TreeNode root) {
    if (root == null) { //如果根结点为空,返回null
        return null;
    }
    Queue<TreeNode> queue = new LinkedList<>(); //创建一个队列来存储每一层的结点
    queue.offer(root); //将根结点入队
    int max = Integer.MIN_VALUE; //初始化最大值为最小整数
    TreeNode maxNode = null; //初始化最大读数的叶子节点为null
    while (!queue.isEmpty()) { //当队列不为空时,循环遍历每一层的结点
        int size = queue.size(); //获取当前层的结点个数
        for (int i = 0; i < size; i++) { //遍历当前层的每个结点
            TreeNode node = queue.poll(); //出队一个结点,并保存为node
            if (node.left == null && node.right == null) { //如果node是叶子结点,判断它的值是否大于最大值,并更新最大值和对应的结点
                if (node.val > max) {
                    max = node.val;
                    maxNode = node;
                }
            } else { //如果node不是叶子结点,将它的左右孩子入队(如果不为空)
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
    }
    return maxNode; //返回最大读数的叶子节点
}

源: 与必应的对话, 2023/7/18
(1) Java 求二叉树的结点数、叶子结点数、高度_java二叉树输出叶子结点_敲木鱼的熊的博客-CSDN博客. https://blog.csdn.net/qq_44847147/article/details/108890147.
(2) Java实现二叉树地遍历、求深度和叶子结点的个数 - 牛cattle - 博客园. https://www.cnblogs.com/ysyasd/p/10810479.html.
(3) 怎么计算完全二叉树叶结点个数 数据结构 - 知乎. https://zhuanlan.zhihu.com/p/137949877.

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1077408
  • 这篇博客也不错, 你可以看下Java创建二叉树,并使用递归算法求二叉树中叶子结点的数目
  • 除此之外, 这篇博客: java求一颗二叉树从根到叶子节点之和的最大值及二叉树的遍历中的 大体思路 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 将根到叶子节点所有路径的值求出来,然后分别计算每条路径的和进行比较,得出最大值,

    • 第一步: 求出根到叶子节点路径的集合
    public static void findPath(Node node, List<List<Node>> paths, List<Node> tempPath) {
            //将当前节点放入到临时路径中
            tempPath.add(node);
    
            //当前节点没有左右节点时,为叶子节点,也就是从根节点到叶子节点的一条路径
            if (node.getLeft() == null && node.getRight() == null) {
                List<Node> list = new ArrayList<>();
                list.addAll(tempPath);//将确定的这条路径放入到一个list中,不能直接将tempPath放入到paths中,因为后续要对tempPath进行操作
                paths.add(list);//将路径保存到路径集合中
                tempPath.remove(node);//处理完一条路径之后,将这个叶子节点删除,方便后续继续处理
            }
    
            if (node.getLeft() != null) {
                findPath(node.getLeft(), paths, tempPath);
            }
    
            if (node.getRight() != null) {
                if (node.getLeft() != null) {//遍历到右子树的时候,需要将之前保存的左子树节点删除,可能当前临时路径中没有左子树节点,也可能有
                    int index = tempPath.indexOf(node);//找到当前节点父节点的位置,
                    tempPath = tempPath.subList(0, index + 1);//从根节点截取到当前父节点的位置(包括当前父节点),做为新的临时路径
                }
                findPath(node.getRight(), paths, tempPath);
            }
        }
    
    • 第二步: 计算每条路径和,进行比较返回最大
    public static int cascSum(Node root){
            List<Node> tempPath = new ArrayList<Node>();
            List<List<Node>> paths = new ArrayList<List<Node>>();
            findPath(root, paths, tempPath);
    
            int sum = 0;
            for (int i = 0; i < paths.size(); i++){
                List<Node> path = paths.get(i);
                int tempSum = 0;
                for(Node node : path){
                    tempSum += node.getValue();
                }
                if (sum < tempSum){
                    sum = tempSum;
                }
            }
            return sum;
        }
    
  • 您还可以看一下 黄菊华老师的Java微信小程序珠宝首饰购物商城 大学生毕业设计教学视频课程中的 java小程序珠宝首饰商城 后台系统发布操作演示小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,我们需要定义二叉树的节点类,包含节点的值和左右子节点的引用:

    class Node {
        int value;
        Node left;
        Node right;
    
        public Node(int value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
    }
    

    接下来,我们可以编写一个方法来计算二叉树上最大值的叶子节点。该方法使用递归算法遍历整个二叉树,并比较每个叶子节点的值,找出最大值。

    class BinaryTree {
        Node root;
    
        public BinaryTree() {
            this.root = null;
        }
    
        public int findMaxLeafValue() {
            if (root == null) {
                return Integer.MIN_VALUE; // 若二叉树为空,返回最小值
            }
            return findMaxLeafValue(root);
        }
    
        private int findMaxLeafValue(Node node) {
            if (node.left == null && node.right == null) {
                return node.value; // 如果是叶子节点,返回节点值
            }
    
            int max = Integer.MIN_VALUE; // 初始化最大值为最小整数
    
            if (node.left != null) {
                max = Math.max(max, findMaxLeafValue(node.left)); // 递归遍历左子树并比较最大值
            }
    
            if (node.right != null) {
                max = Math.max(max, findMaxLeafValue(node.right)); // 递归遍历右子树并比较最大值
            }
    
            return max;
        }
    }
    

    接下来,我们可以编写一个方法来输出二叉树上最大值的叶子节点的值。该方法先找到最大值,然后再遍历一次二叉树,找到符合最大值的叶子节点并输出。

    class BinaryTree {
        // ...
    
        public void printMaxLeafValue() {
            int max = findMaxLeafValue();
    
            if (max == Integer.MIN_VALUE) {
                System.out.println("Empty tree"); // 如果二叉树为空
                return;
            }
    
            printMaxLeafValue(root, max);
        }
    
        private void printMaxLeafValue(Node node, int max) {
            if (node == null) {
                return;
            }
    
            if (node.left == null && node.right == null && node.value == max) {
                System.out.println(node.value); // 如果是叶子节点且值等于最大值,输出该节点的值
            }
    
            // 递归遍历左右子树
            printMaxLeafValue(node.left, max);
            printMaxLeafValue(node.right, max);
        }
    }
    

    最后,我们可以在主程序中使用上述代码来计算最大值的叶子节点并输出。

    public class Main {
        public static void main(String[] args) {
            BinaryTree tree = new BinaryTree();
            // 构建二叉树
            tree.root = new Node(1);
            tree.root.left = new Node(2);
            tree.root.right = new Node(3);
            tree.root.left.left = new Node(4);
            tree.root.left.right = new Node(5);
            tree.root.right.left = new Node(6);
            tree.root.right.right = new Node(7);
    
            int max = tree.findMaxLeafValue();
            System.out.println("The max leaf value is: " + max);
    
            System.out.println("The nodes with max leaf value are:");
            tree.printMaxLeafValue();
        }
    }
    

    这样,我们就可以通过Java语言计算一颗二叉树上最大值的叶子节点,并将结果进行输出了。