Teaching Kids Programming: Videos on Data Structures and Algorithms
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: trueExample 2:
Input: root1 = [1], root2 = [1]
Output: trueExample 3:
Input: root1 = [1], root2 = [2]
Output: falseExample 4:
Input: root1 = [1,2], root2 = [2,2]
Output: trueExample 5:
Input: root1 = [1,2,3], root2 = [1,3,2]
Output: falseConstraints:
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].
Recursive Depth First Search Algorithm to Check Leaf Similar Trees
We perform Depth First Search to get the sequence of the leafs in the preorder. We can implement a DFS function to return a list of leaves for the current binary tree in the preorder (from left to the right), and then compare the leaves lists for two binary trees.
# 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 leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
def dfs(node):
if not node:
return
ans = []
if not node.left and not node.right:
ans.append(node.val)
left = dfs(node.left)
if left:
ans += left
right = dfs(node.right)
if right:
ans += right
return ans
return dfs(root1) == dfs(root2)
We can use the yield and yield from instead of returning a list – which gives simpler/shorter implementation:
# 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 leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
def dfs(node):
if not node:
return
if not node.left and not node.right:
yield node.val
yield from dfs(node.left)
yield from dfs(node.right)
return list(dfs(root1)) == list(dfs(root2))
Then, we need to convert the generator to list – comparing the generator directly will always give a false result.
See also: Teaching Kids Programming – Recursive Depth First Search Algorithm to Compare Leaf Equivalent Trees
–EOF (The Ultimate Computing & Technology Blog) —
603 wordsLast Post: Using ADODB to Query SQLite in VBScript
Next Post: How to List the Boot Configuration Properties on Windows using VBScript?
