LeetCode 951. Flip Equivalent Binary Trees
阿新 • • 發佈:2018-12-14
方法一:遞迴
樹的題,大部分都是遞迴。這道題的話,和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) returnfalse; // 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); } stringserialize(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後字串需要佔空間。