java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
文章目录 1. 深度优先,用下面的儿子判断 2. 深度优先,用父结点判断
1. 深度优先,用下面的儿子判断
利用深度优先遍历,从最底下的结点开始,依次和左右儿子进行比较 如果当前结点,和左儿子相同,则左子树路径长度+1 如果和右儿子相同,右子树路径长度+1 将左右子树和当前结点相连后的路径长度保存起来 然后继续递归遍历,上面将相连的保存了,接下来就是不连左右子树,那么就返回左右子树长的一条。
class Solution { int max; public int longestUnivaluePath ( TreeNode root) { max = 0 ; dfs ( root) ; return max; } public int dfs ( TreeNode root) { if ( root == null ) return 0 ; int left = dfs ( root. left) ; int right = dfs ( root. right) ; int _left = 0 , _right = 0 ; if ( root. left != null && root. left. val == root. val) _left = left+ 1 ; if ( root. right != null && root. right. val == root. val) _right = right+ 1 ; max = Math . max ( max, _left+ _right) ; return Math . max ( _left, _right) ; }
}
2. 深度优先,用父结点判断
一个细节的改变,可以省下一些判断 每次深度优先遍历时,传入当前结点的值(下一个结点的父结点) 如果当前结点和父结点值相同,就返回较长路径长度 不断记录相连后的最大路径
class Solution { int max = 0 ; public int longestUnivaluePath ( TreeNode root) { dfs ( root, - 1 ) ; return max; } public int dfs ( TreeNode root, int parentVal) { if ( root == null ) return 0 ; int left = dfs ( root. left, root. val) ; int right = dfs ( root. right, root. val) ; max = Math . max ( max, left+ right) ; if ( root. val == parentVal) return Math . max ( left, right) + 1 ; return 0 ; }
}