leetcode[Diameter of Binary Tree]//待整理多种解法

本文介绍了一种求解二叉树直径的有效算法。通过遍历每个节点并计算左右子树深度来找出最长路径,利用自定义类解决整型变量不可修改的问题。此方法虽不能给出具体路径,但能高效求得路径长度。

解法一:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class MyInt{//自定义一个类,为了在传给方法int类型时可以修改其值
	int val;
}

public class Solution {
	//对于树的每一条串联起来的路径,都是从一个叶子结点指向另一个叶子结点,
	//而且最长的那条路径不一定经过根节点
	//正是因为那条最长的路径不一定经过根节点,所以需要遍历所有的结点,对于每一个结点,经过它的最长的路径的,其实就是它的左子树的深度加上,它的右子树的深度,再加1
	//所以弄清楚问题的实质:实际是一个遍历二叉树与求深度结合起来的问题,但是这种方法只能求出具体的长度,无法求出具体有哪些路径
	private int depth(TreeNode root){//求二叉树的深度
		if(root == null) return 0;
		return 1 + Math.max(depth(root.left), depth(root.right));
	}
	
	private void recurse(TreeNode root, MyInt max){//遍历二叉树
		if(root == null) return;
		int curDiameter = 1 + depth(root.left) + depth(root.right) - 1;//求出经过当前结点的路径的最大长度,减1是根据题目的要求调整的
        //System.out.println("node.val:" + root.val + "  depth_left:" + depth(root.left) + "  depth_left:" + depth(root.right));
		max.val = Math.max(max.val, curDiameter);
		recurse(root.left, max);
		recurse(root.right, max);
	}
	
    public int diameterOfBinaryTree(TreeNode root) {
        MyInt max = new MyInt();
        max.val = 0;
        recurse(root, max);
        return max.val;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值