【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)

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