872. Leaf-Similar Trees

Problem

Consider all the leaves of a binary tree, from left to right order, the values of those leaves form a leaf value sequence.

For example, in the given tree above, the leaf value sequence is (6, 7, 4, 9, 8).

Two binary trees are considered leaf-similar if their leaf value sequence is the same.

Return true if and only if the two given trees with head nodes root1 and root2 are leaf-similar.

 

Example 1:

Input: root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
Output: true

Example 2:

Input: root1 = [1], root2 = [1]
Output: true

Example 3:

Input: root1 = [1], root2 = [2]
Output: false

Example 4:

Input: root1 = [1,2], root2 = [2,2]
Output: true

Example 5:

Input: root1 = [1,2,3], root2 = [1,3,2]
Output: false

 

Constraints:

  • The number of nodes in each tree will be in the range [1, 200].
  • Both of the given trees will have values in the range [0, 200].

Discussion

The problem requires us to find compare two trees with the sequence of their leaf nodes. As the leaf nodes may not by lying on the same level, we are going to use DFS to scan for the leaf nodes as array and perform comparison.

Solution

Our solution starts with writing an standard DFS function to scan for leaf nodes. Leaf nodes are then appended to target array. A complete DFS function should scan all the leaf nodes and put them to an array with maintained sequence.

We simply compare the two array and result is obtained.

class Solution:
    def leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
        self.arr = []

        self.dfs(root1)
        arr1, self.arr = self.arr, []

        self.dfs(root2)
        arr2, self.arr = self.arr, []

        return arr1 == arr2

    def dfs(self, root):
        if not root:
            return
        if root.left:
            self.dfs(root.left)
        if not root.left and not root.right:
            self.arr += [root.val]
        if root.right:
            self.dfs(root.right)

Complexity Analysis

  • Time Complexity: O(n), as DFS scan all the nodes in a tree and giving a linear time complexity. Perform it twice gives an linear solution as well.
  • Space Complexity: O(n), regardless of the deep recursion memory for DFS, we are caching all the leaf nodes in a array, which causing linear space complexity already.