[leetcode] 1372. Longest ZigZag Path in a Binary Tree

Description

Given a binary tree root, a ZigZag path for a binary tree is defined as follow:

  • Choose any node in the binary tree and a direction (right or left).
  • If the current direction is right then move to the right child of the current node otherwise move to the left child.
  • Change the direction from right to left or right to left.
  • Repeat the second and third step until you can’t move in the tree.

Zigzag length is defined as the number of nodes visited - 1. (A single node has a length of 0).

Return the longest ZigZag path contained in that tree.

Example 1:

Input: root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
Output: 3
Explanation: Longest ZigZag path in blue nodes (right -> left -> right).

Example 2:

Input: root = [1,1,1,null,1,null,null,1,1,null,1]
Output: 4
Explanation: Longest ZigZag path in blue nodes (left -> right -> left -> right).

Example 3:

Input: root = [1]
Output: 0

Constraints:

  • Each tree has at most 50000 nodes…
  • Each node’s value is between [1, 100].

analysis

The meaning of the question is: Find the longest zigzag chain of the binary tree. I read the hint for this question. To use the idea of ​​dynamic programming, use isLeft to mark the current node needs to be traversed left or right. If it is True, The next step can be left or right. If it is to the left, step+1, if it is to the right, step should be set to 1, which means that the zigzag chain cannot be formed and needs to be counted from the beginning; if it is false, the next step can be kept To the right, it can also be to the left, if it is to the right, step+1, if it is to the left, the step should be set to 1, which means that the zigzag chain cannot be formed, and the counting needs to be started from the beginning.

Code

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxZigZag(self,root,isLeft,step):
        if(root is None):
            return
        self.maxStep=max(self.maxStep,step)
        if(isLeft):
            self.maxZigZag(root.right,True,1)
            self.maxZigZag(root.left,False,step+1)
        else:
            self.maxZigZag(root.right,True,step+1)
            self.maxZigZag(root.left,False,1)
        
    def longestZigZag(self, root: TreeNode) -> int:
        self.maxStep=0
        self.maxZigZag(root,True,0)
        self.maxZigZag(root,False,0)
        return self.maxStep

references

[LeetCode] [Java/C++] DFS Solution with comment - O(N) - Clean code

Guess you like

Origin blog.csdn.net/w5688414/article/details/109309109