题目地址:
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;
}
}
时空复杂度。