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;}
}