題目地址:
https://www.lintcode.com/problem/leaf-similar-trees/description
定義一棵二叉樹的”樹葉序列“,爲其所有葉子從左到右排列所成的序列。兩個葉子和,排在前面當且僅當在其最近公共祖先的左子樹中並且在右子樹中,或者其一爲樹根然後另一個在左或右子樹中。
思路是,先用DFS求出兩棵樹的葉子序列,最後做比較。代碼如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
/**
* @param root1: the first tree
* @param root2: the second tree
* @return: returns whether the leaf sequence is the same
*/
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
// write your code here.
List<Integer> leaves1 = new ArrayList<>(), leaves2 = new ArrayList<>();
dfs(root1, leaves1);
dfs(root2, leaves2);
if (leaves1.size() != leaves2.size()) {
return false;
}
for (int i = 0; i < leaves1.size(); i++) {
if (!leaves1.get(i).equals(leaves2.get(i))) {
return false;
}
}
return true;
}
private void dfs(TreeNode root, List<Integer> leaves) {
if (root == null) {
return;
}
// 碰到葉子則加入列表中
if (root.left == null && root.right == null) {
leaves.add(root.val);
return;
}
// 然後分別收集左右子樹中的葉子
dfs(root.left, leaves);
dfs(root.right, leaves);
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
時空複雜度。