题目链接
二叉树中的最长交错路径
题目描述
注意点
- 每个节点的值在 [1, 100] 之间
解答思路
- 深度优先遍历整棵树,遍历的同时需要将到达根节点是向左交叉还是向右交叉以及路径长度传递到子树。当根节点是向左交叉遍历而来,子树想和根节点组成路径就只能向右交叉(也就是只能到达右子树),当然也可以向左交叉,但此时左子树无法与根节点组成路径,左子树只能重新作为根节点继续向下遍历(向右交叉,路径为0);当根节点是向右交叉遍历而来,也是同理
- 因为除了根节点以外其余节点都是某个节点的左子树或右子树,所以其只能由向左交叉或向右交叉而来。其作为左子树只能向左交叉,连接其根节点时要想继续向下遍历就只能向右交叉,如果想向左交叉就只能自己作为根节点,路径重置为0;其作为右子树时也是同理
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public int longestZigZag(TreeNode root) {return dfs(root, true, 0) - 1;}public int dfs(TreeNode root, boolean isLeft, int depth) {if (root == null) {return depth;}int leftDepth = 0;int rightDepth = 0;if (isLeft) {// 当前为左,与上一个节点组成路径只能向右,当前节点作为根节点可以向左leftDepth = dfs(root.left, true, 1);rightDepth = dfs(root.right, false, depth + 1);} else {// 当前为右,与上一个节点组成路径只能向左,当前节点作为根节点可以向右leftDepth = dfs(root.left, true, depth + 1);rightDepth = dfs(root.right, false, 1);}return Math.max(leftDepth, rightDepth);}
}
关键点
- 深度优先遍历的思想