1. 程式人生 > >LeetCode 951. Flip Equivalent Binary Trees

LeetCode 951. Flip Equivalent Binary Trees

方法一:遞迴

樹的題,大部分都是遞迴。這道題的話,和same tree很像,無非就是加個判斷看看是不是翻轉的。

時間複雜度:T(n) = 4T(n/2), by Master Theorem, 時間複雜度 O(n^2)

空間複雜度:O(h)

class Solution {
public:
    bool flipEquiv(TreeNode* root1, TreeNode* root2) {
        if (root1==NULL && root2==NULL) return true;
        if (root1==NULL || root2==NULL) return
false; // here root1 not null, root2 not null if (root1->val!=root2->val) return false; return flipEquiv(root1->left, root2->left) && flipEquiv(root1->right, root2->right) || flipEquiv(root1->left, root2->right) && flipEquiv(root1->right, root2->left); } };

 

方法二:Serialize Tree

Serialize Tree方法很多,可以參考那一道題。這裡就用preorder。

考慮到翻轉,所以序列化的時候,dfs的時候,左右兒子中val小的先遍歷,這樣就算有翻轉的情況,最後serialize的結果也是一樣的。

class Solution {
public:
    bool flipEquiv(TreeNode* root1, TreeNode* root2) {
        return serialize(root1)==serialize(root2);
    }
    
    string
serialize(TreeNode *root){ if (root==NULL) return "#"; string res=to_string(root->val); int left_val=root->left!=NULL?root->left->val:-1; int right_val=root->right!=NULL?root->right->val:-1; if (left_val<right_val) res += ' ' + serialize(root->left) + ' ' + serialize(root->right); else res += ' ' + serialize(root->right) + ' ' + serialize(root->left); return res; } };

時間複雜度:和遍歷樹類似,O(n)

空間複雜度:serialize後字串需要佔空間。