领扣LintCode算法问题答案-614. 二叉树的最长连续子序列 II

领扣LintCode算法问题答案-614. 二叉树的最长连续子序列 II

614. 二叉树的最长连续子序列 II

描述

给定一棵二叉树,找到最长连续序列(单调且相邻节点值相差为1)路径的长度(节点数)。
路径起点跟终点可以为二叉树的任意节点。

样例 1:

输入:
	{1,2,0,3}
输出:
	4
解释:
	    1
	   / \
	  2   0
	 /
	3
	0-1-2-3

样例 2:

输入:
	{3,2,2}
输出:
	2
解释:
	    3
	   / \
	  2   2
	2-3

原题链接点这里

题解

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
     public int longestConsecutive2(TreeNode root) {
    	// write your code here
		Pointer<Integer> longestConsecutive = new Pointer(1);
		longestInfo(root, longestConsecutive);
		return longestConsecutive.getValue();
	}

	public ReturnInfo longestInfo(TreeNode root, Pointer<Integer> longestConsecutive) {
		if (root == null) return new ReturnInfo(0, 0);//nullptr返回(0,0)
		int        up    = 1;//默认只有根节点,初始化为1
		int        down  = 1;
		ReturnInfo tempL = longestInfo(root.left, longestConsecutive);//左右节点的连续信息
		ReturnInfo tempR = longestInfo(root.right, longestConsecutive);

		if (root.left != null) {
			if (root.left.val == root.val - 1) up = Math.max(up, tempL.up + 1);//左子树是否连续进行更新
			if (root.left.val == root.val + 1) down = Math.max(down, tempL.down + 1);
		}

		if (root.right != null) {
			if (root.right.val == root.val - 1) up = Math.max(up, tempR.up + 1);//右子树处理
			if (root.right.val == root.val + 1) down = Math.max(down, tempR.down + 1);
		}

		longestConsecutive.setValue(Math.max(longestConsecutive.getValue(), up + down - 1));//以当前root为最高点的连续数字最多数量,仔细想想就是up+down-1。
		return new ReturnInfo(up, down);
	}

	class ReturnInfo {
		private int up;
		private int down;

		ReturnInfo(int up, int down) {
			this.up = up;
			this.down = down;
		}
	}
	
	
	private class Pointer<T> {
		private T value;
	
		public Pointer(T value) {
			this.value = value;
		}
	
		public T getValue() {
			return value;
		}
	
		public void setValue(T value) {
			this.value = value;
		}
	}
}

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页