连云港网站建设培训班,公共资源交易中心是干嘛的,常州微信网站建设公司,工信部网站备案投诉给你一棵以 root 为根的二叉树#xff0c;二叉树中的交错路径定义如下#xff1a;
选择二叉树中 任意 节点和一个方向#xff08;左或者右#xff09;。 如果前进方向为右#xff0c;那么移动到当前节点的的右子节点#xff0c;否则移动到它的左子节点。 改变前进方向二叉树中的交错路径定义如下
选择二叉树中 任意 节点和一个方向左或者右。 如果前进方向为右那么移动到当前节点的的右子节点否则移动到它的左子节点。 改变前进方向左变右或者右变左。 重复第二步和第三步直到你在树中无法继续移动。 交错路径的长度定义为访问过的节点数目 - 1单个节点的路径长度为 0 。 请你返回给定树中最长 交错路径 的长度。
示例 1 输入root [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1] 输出3 解释蓝色节点为树中最长交错路径右 - 左 - 右。
示例 2 输入root [1,1,1,null,1,null,null,1,1,null,1] 输出4 解释蓝色节点为树中最长交错路径左 - 右 - 左 - 右。 示例 3
输入root [1] 输出0
提示 每棵树最多有 50000 个节点。 每个节点的值在 [1, 100] 之间。
思路1采用动态规划设根节点为 root, 当前 节点为 temp, 假设以 temp 节点为终结点(temp 节点是父节点的左子节点)的最长交错路径为 l_temptemp 节点为终结点(temp 节点是父节点的右子节点)的最长交错路径为 r_temp 显然如果 temp1为 temp 的左子节点l_temp1 r_temp 1, 如果是右子节点 r_temp1 l_temp1 1
class Solution:def longestZigZag(self, root: Optional[TreeNode]) - int:if root None:return 0res 0l_mp collections.defaultdict(int) ### 存放以当前位置为终点的最长交错路径长度(是root 节点的左子节点)r_mp collections.defaultdict(int)q collections.deque()q.append(root)while len(q) 0:top q.popleft()if top.left ! None:l_mp[top.left] r_mp[top] 1q.append(top.left)if top.right ! None:r_mp[top.right] l_mp[top] 1q.append(top.right)for x in l_mp:res max(res, l_mp[x])for x in r_mp:res max(res, r_mp[x]) return res 另一种思路是递归
def longestZigZag(self, root: Optional[TreeNode]) - int:if root None:return 0res 0def dfs(root, direction, depth):if root None:returnnonlocal resres max(res, depth)if direction 0: # leftdfs(root.right, 1, depth1)dfs(root.right, 0, 0)else:dfs(root.left, 0, depth1)dfs(root.left, 1, 0)dfs(root, 0, 0)dfs(root, 1, 0)return res