遞歸法css
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSymmetric(TreeNode* root) { if(root == NULL) return true; if( isMirror(root->left, root->right)) return true; else return false; } bool isMirror(TreeNode* lc, TreeNode* rc) { if(lc == NULL && rc == NULL) return true; if(lc == NULL || rc == NULL) return false; else { if (lc->val == rc->val) return (isMirror(lc->left, rc->right) && isMirror(lc->right, rc->left)); else return false; } } };
時間複雜度:html
O(n),由於算法過程要遍歷樹的每個節點,節點數量爲n。node
空間複雜度:算法
O(n),遞歸函數使用的棧空間與樹的層數有關。若是樹爲線性結構,其層數爲n,因此空間複雜度爲O(n)函數
迭代法spa
class Solution { public: bool isSymmetric(TreeNode* root) { if(root == NULL) return true; queue< TreeNode* > q1; queue< TreeNode* > q2; q1.push(root->left); q2.push(root->right); while(q1.size()>0 && q2.size()>0) { TreeNode* n1 = q1.front(); TreeNode* n2 = q2.front(); q1.pop(); q2.pop(); if(n1 == NULL && n2 == NULL) continue; if(n1 == NULL || n2 == NULL) return false; if(n1->val == n2->val) { q1.push(n1->left); q2.push(n2->right); q1.push(n1->right); q2.push(n2->left); } else return false; } return true; } };
時間複雜度:code
O(n) 要遍歷每個節點;htm
空間複雜度:blog
搜索隊列須要額外的空間。在最糟糕狀況下,咱們不得不向隊列中插入 O(n)個結點(???)。所以,空間複雜度爲 O(n)。
遞歸