---
# System prepended metadata

title: 'LeetCode #872 [Leaf-Similar Trees](https://leetcode.com/problems/leaf-similar-trees/)'
tags: [DFS, Recursion, LeetCode, Easy, Stack, Tree]

---

###### tags: `LeetCode` `Tree` `Recursion` `Easy` `Stack` `DFS`
# LeetCode #872 [Leaf-Similar Trees](https://leetcode.com/problems/leaf-similar-trees/)
### (Easy)
請考慮一棵二元樹上所有的葉子，這些葉子的值按從左到右的順序排列形成一個 葉值序列 。
![](https://i.imgur.com/OkMPKdW.png)
舉個例子，如上圖所示，給定一棵葉值序列為 (6, 7, 4, 9, 8) 的樹。

如果有兩棵二元樹的葉值序列是相同，那麼我們就認為它們是 葉相似 的。

如果給定的兩個根結點分別為 root1 和 root2 的樹是葉相似的，則返回 true；否則返回 false 。


---
簡單做法:

以遞迴法建立兩數組儲存兩樹的葉節點(若左右子節點皆為空則該節點為葉節點), 再比較兩數組是否相等。
```
class Solution {
public:
    vector<int> r1,r2;
    bool leafSimilar(TreeNode* root1, TreeNode* root2) {
        helper(root1,r1);
        helper(root2,r2);
        if(r1.size()!=r2.size())return false;
        for(int i=0;i<r1.size();i++){
            if(r1[i]!=r2[i])return false;
        }
        return true;
    }
    void helper(TreeNode* node, vector<int>& v){
        if(!node)return;
        else if(!node->left&&!node->right)v.push_back(node->val);
        if(node->left)helper(node->left, v);
        if(node->right)helper(node->right, v);
    }
};
```


---
LeetCode版:

利用DFS特性比較兩樹的葉節點順序。
```
class Solution {
public:
    bool leafSimilar(TreeNode* root1, TreeNode* root2) {
        stack<TreeNode*> s1 , s2;
        s1.push(root1); s2.push(root2);
        while (!s1.empty() && !s2.empty())
            if (dfs(s1) != dfs(s2)) return false;//比較回傳值
        return s1.empty() && s2.empty();
    }

    int dfs(stack<TreeNode*>& s) {
        while (true) {
            TreeNode* node = s.top(); s.pop();
            if (node->right) s.push(node->right);
            if (node->left) s.push(node->left);
            if (!node->left && !node->right) return node->val;//葉節點->回傳節點值
        }
    }
};
```