请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
    举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。
    如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。
    如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

    示例 1:
    输入: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]

    1. 3
    2. / \
    3. 5 1
    4. / \ / \
    5. 6 2 9 8
    6. / \
    7. 7 4
    8. 3
    9. / \
    10. 5 1
    11. / \ / \
    12. 6 7 4 2
    13. / \
    14. 9 8

    输出:true

    示例 2:
    输入:root1 = [1,2,3], root2 = [1,3,2]
    输出:false

    可以定义一个辅助算法,遍历二叉树并得到叶子节点结果集:

    1. private void order(TreeNode node, List<Integer> result) {
    2. if (node == null) {
    3. return;
    4. }
    5. order(node.left, result);
    6. if (node.left == null && node.right == null) {
    7. result.add(node.val);
    8. }
    9. order(node.right, result);
    10. }

    只要分别得到两棵树的叶子节点结果集,并且逐一比较结果集元素是否相等:

    1. public boolean leafSimilar(TreeNode root1, TreeNode root2) {
    2. // 遍历二叉树得到二叉树的叶子节点结果集
    3. List<Integer> result1 = new ArrayList<>();
    4. List<Integer> result2 = new ArrayList<>();
    5. order(root1, result1);
    6. order(root2, result2);
    7. // 比较结果集元素数量是否相等,不相等自然叶子不相似
    8. if (result1.size() != result2.size()) {
    9. return false;
    10. }
    11. // 逐个比较结果集的元素是否相等
    12. boolean isSimilar = true;
    13. for (int i = 0; i < result1.size(); i++) {
    14. if (result1.get(i).intValue() != result2.get(i).intValue()) {
    15. isSimilar = false;
    16. break;
    17. }
    18. }
    19. return isSimilar;
    20. }

    前序遍历,中序遍历,后序遍历,层次遍历等都可以