LeetCode 872: Leaf-Similar Trees (DFS Leaf Sequence Comparison)
LeetCode 872Binary TreeDFSToday we solve LeetCode 872 - Leaf-Similar Trees.
Source: https://leetcode.com/problems/leaf-similar-trees/
English
Problem Summary
Two binary trees are leaf-similar if the values of all leaves from left to right form the same sequence.
Approach
Run DFS on each tree, append values only when reaching a leaf node, then compare the two resulting arrays.
Complexity
Time: O(n + m), where n and m are node counts of two trees.
Space: O(h1 + h2 + l1 + l2) for recursion stack and leaf arrays.
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();
dfs(root1, a);
dfs(root2, b);
return a.equals(b);
}
private void dfs(TreeNode node, List<Integer> out) {
if (node == null) return;
if (node.left == null && node.right == null) {
out.add(node.val);
return;
}
dfs(node.left, out);
dfs(node.right, out);
}
}func leafSimilar(root1 *TreeNode, root2 *TreeNode) bool {
a, b := []int{}, []int{}
dfs(root1, &a)
dfs(root2, &b)
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
func dfs(node *TreeNode, out *[]int) {
if node == nil {
return
}
if node.Left == nil && node.Right == nil {
*out = append(*out, node.Val)
return
}
dfs(node.Left, out)
dfs(node.Right, out)
}class Solution {
public:
bool leafSimilar(TreeNode* root1, TreeNode* root2) {
vector<int> a, b;
dfs(root1, a);
dfs(root2, b);
return a == b;
}
void dfs(TreeNode* node, vector<int>& out) {
if (!node) return;
if (!node->left && !node->right) {
out.push_back(node->val);
return;
}
dfs(node->left, out);
dfs(node->right, out);
}
};class Solution:
def leafSimilar(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
a, b = [], []
self.dfs(root1, a)
self.dfs(root2, b)
return a == b
def dfs(self, node: Optional[TreeNode], out: list[int]) -> None:
if not node:
return
if not node.left and not node.right:
out.append(node.val)
return
self.dfs(node.left, out)
self.dfs(node.right, out)var leafSimilar = function(root1, root2) {
const a = [], b = [];
dfs(root1, a);
dfs(root2, b);
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) return false;
}
return true;
};
function dfs(node, out) {
if (!node) return;
if (!node.left && !node.right) {
out.push(node.val);
return;
}
dfs(node.left, out);
dfs(node.right, out);
}中文
题目概述
如果两棵二叉树从左到右的叶子节点序列完全一致,就称它们是叶子相似树。
解题思路
分别对两棵树做 DFS,只在遇到叶子节点时记录值,得到两个叶子序列后直接比较是否相同。
复杂度分析
时间复杂度:O(n + m)。
空间复杂度:O(h1 + h2 + l1 + l2),主要是递归栈和叶子数组。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();
dfs(root1, a);
dfs(root2, b);
return a.equals(b);
}
private void dfs(TreeNode node, List<Integer> out) {
if (node == null) return;
if (node.left == null && node.right == null) {
out.add(node.val);
return;
}
dfs(node.left, out);
dfs(node.right, out);
}
}func leafSimilar(root1 *TreeNode, root2 *TreeNode) bool {
a, b := []int{}, []int{}
dfs(root1, &a)
dfs(root2, &b)
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
func dfs(node *TreeNode, out *[]int) {
if node == nil {
return
}
if node.Left == nil && node.Right == nil {
*out = append(*out, node.Val)
return
}
dfs(node.Left, out)
dfs(node.Right, out)
}class Solution {
public:
bool leafSimilar(TreeNode* root1, TreeNode* root2) {
vector<int> a, b;
dfs(root1, a);
dfs(root2, b);
return a == b;
}
void dfs(TreeNode* node, vector<int>& out) {
if (!node) return;
if (!node->left && !node->right) {
out.push_back(node->val);
return;
}
dfs(node->left, out);
dfs(node->right, out);
}
};class Solution:
def leafSimilar(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
a, b = [], []
self.dfs(root1, a)
self.dfs(root2, b)
return a == b
def dfs(self, node: Optional[TreeNode], out: list[int]) -> None:
if not node:
return
if not node.left and not node.right:
out.append(node.val)
return
self.dfs(node.left, out)
self.dfs(node.right, out)var leafSimilar = function(root1, root2) {
const a = [], b = [];
dfs(root1, a);
dfs(root2, b);
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) return false;
}
return true;
};
function dfs(node, out) {
if (!node) return;
if (!node.left && !node.right) {
out.push(node.val);
return;
}
dfs(node.left, out);
dfs(node.right, out);
}
Comments