【Lintcode】1495. Leaf-Similar Trees

题目地址:

https://www.lintcode.com/problem/leaf-similar-trees/description

定义一棵二叉树的”树叶序列“,为其所有叶子从左到右排列所成的序列。两个叶子xxyyxx排在yy前面当且仅当xx在其最近公共祖先lca(x,y)lca(x,y)的左子树中并且yy在右子树中,或者其一为树根然后另一个在左或右子树中。

思路是,先用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;
    }
}

时空复杂度O(n1+n2)O(n_1+n_2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章