zoukankan      html  css  js  c++  java
  • Symmetric Tree [LeetCode]

    Problem description: http://oj.leetcode.com/problems/symmetric-tree/

    Basic idea: Both recursive and iterative solutions. 

    Iterative solution:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool isSymmetric(TreeNode *root) {
    13         // Note: The Solution object is instantiated only once and is reused by each test case.
    14         if(root == NULL) 
    15             return true;
    16         
    17         vector<TreeNode*> layer;
    18         layer.push_back(root);
    19         while(true) {
    20             //determine if the tree is symetric
    21             for(int i = 0; i < layer.size()/2; i ++ ) {
    22                 //layer[i] compare layer[layer.size() - 1 - i]
    23                 int right_idx = layer.size() - 1 - i;
    24                 if((layer[i]->left == NULL && layer[right_idx]->right == NULL ||
    25                     (layer[i]->left != NULL && layer[right_idx]->right != NULL &&
    26                     layer[i]->left->val == layer[right_idx]->right->val)) && 
    27                     (layer[i]->right == NULL && layer[right_idx]->left == NULL ||
    28                      (layer[i]->right != NULL && layer[right_idx]->left != NULL && 
    29                      layer[i]->right->val == layer[right_idx]->left->val)))
    30                     continue;
    31                 else
    32                     return false;
    33             }
    34             
    35             if(layer.size() % 2 != 0) {
    36                 int middle = layer.size() / 2;
    37                 if(layer[middle]->left == NULL && layer[middle]->right == NULL ||
    38                     (layer[middle]->left != NULL && layer[middle]->right != NULL && 
    39                     layer[middle]->left->val == layer[middle]->right->val)){
    40                         //do nothing
    41                     }else{
    42                         return false;
    43                     }
    44             }
    45             
    46             //get node for next layer
    47             vector<TreeNode*> new_layer;
    48             for(auto node : layer) {
    49                 if(node->left != NULL)
    50                     new_layer.push_back(node->left);
    51                 if(node->right != NULL)
    52                     new_layer.push_back(node->right);
    53             }
    54             if(new_layer.size() == 0)
    55                 break;
    56                 
    57             layer = new_layer;
    58         }
    59         
    60         return true;
    61     }
    62 };

    Recursive solution: easier to understand.

     1 class Solution {
     2 public:
     3     bool isSubSymmetric(TreeNode * left, TreeNode * right) {
     4         if(left == NULL && right == NULL)
     5             return true;
     6         else if(left != NULL && right == NULL || (right != NULL && left == NULL))
     7             return false;
     8         else if(left->val != right->val)
     9             return false;
    10         else
    11             return isSubSymmetric(left->left, right->right) && isSubSymmetric(left->right, right->left);
    12     }
    13     bool isSymmetric(TreeNode *root) {
    14         // Note: The Solution object is instantiated only once and is reused by each test case.
    15         if(root == NULL) 
    16             return true;
    17         
    18         return isSubSymmetric(root->left, root->right);
    19     }
    20 };
  • 相关阅读:
    【404】int main(int argc,char * argv[]) windows 下的使用
    【403】COMP9024 Exercise
    【402】Twitter Data Collection
    【401】Python 求合数的所有质数因子
    【400】numpy.pad 为数组加垫(迷宫类题目)
    iOS开发之指纹解锁
    iOS-响应链(Responder Chain)
    iOS上手指点击波纹效果的实现
    使用methodSignatureForSelector与forwardInvocation实现消息转发 (转)
    Objective-C中的@dynamic(转)
  • 原文地址:https://www.cnblogs.com/guyufei/p/3390484.html
Copyright © 2011-2022 走看看