LeetCode Symmetric Tree

 1 class Solution {
 2 public:
 3     bool isSymmetric(TreeNode *root) {
 4         if (root == NULL) return true;
 5         return dfs(root->left, root->right);
 6     }
 7     
 8     bool dfs(TreeNode* curnode, TreeNode* symnode) {
 9         if (curnode == NULL && symnode == NULL) return true;
10         if (curnode != NULL && symnode != NULL && curnode->val == symnode->val) {
11             return dfs(curnode->left, symnode->right) && dfs(curnode->right, symnode->left);
12         }
13         return false;
14     }
15     
16     bool _isSymmetric(TreeNode *root) {
17         if (root == NULL) return true;
18         vector<TreeNode*> sa;
19         vector<TreeNode*> sb;
20         sa.push_back(root->left);
21         sb.push_back(root->right);
22 
23         while (!sa.empty() && !sb.empty()) {
24             TreeNode* anode = sa.back();
25             TreeNode* bnode = sb.back();
26 
27             sa.pop_back();
28             sb.pop_back();
29             
30             if (anode == NULL && bnode == NULL) {
31                 continue;
32             }
33             
34             if (anode != NULL && bnode != NULL && anode->val == bnode->val) {
35                 sa.push_back(anode->left);
36                 sb.push_back(bnode->right);
37 
38                 sa.push_back(anode->right);
39                 sb.push_back(bnode->left);
40             } else {
41                 return false;
42             }
43         }
44         if (sa.size() != sb.size()) return false;
45         return true;
46     }
47 };

同时对左右子树进行遍历,只不过因为是对称的所以遍历时节点顺序要交换一下。如果是对称的,那么遍历节点应该一一对应,如果中间出现不一致则不对称。

第二轮:

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

 

But the following is not:

    1
   / \
  2   2
   \   \
   3    3
只回忆起递归版本
/**
 * Definition for binary tree
 * 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;
        }
        return isSymmetric(root->left, root->right);
    }
    
    bool isSymmetric(TreeNode* root, TreeNode* symRoot) {
        if (root == NULL && symRoot == NULL) {
            return true;
        }
        if (root == NULL || symRoot == NULL) {
            return false;
        }
        if (root->val != symRoot->val) {
            return false;
        }
        
        return isSymmetric(root->left, symRoot->right) && isSymmetric(root->right, symRoot->left);
    }
};

 

posted @ 2014-04-01 16:05  卖程序的小歪  阅读(146)  评论(0编辑  收藏  举报