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

    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
    

    Note:
    Bonus points if you could solve it both recursively and iteratively.

    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

    Hide Tags
     Tree Depth-first Search
     

      这个嘛,用两个队列,一个维护树从左到右,一个维护树的从右到左。这就好了。写了两个,一个识queue 中是已经已经符合的,弹出后判断其子节点是否符合,这样queue 中不维护NULL。
     1 class Solution {
     2 public:
     3     bool isSymmetric(TreeNode *root) {
     4         if(root==NULL||(root->left==NULL&&root->right==NULL))  return true;
     5         if(root->left==NULL||root->right==NULL||root->left->val!=root->right->val)   return false;
     6         queue<TreeNode*> lft;
     7         lft.push(root->left);
     8         queue<TreeNode*> rgt;
     9         rgt.push(root->right);
    10         while(( !lft.empty() )||( !rgt.empty() )){
    11             int nlft=lft.size(),nrgt=rgt.size();
    12             if(nlft!=nrgt)  return false;
    13             for(int i=0;i<nlft;i++){
    14                 TreeNode* curlft=lft.front(),*currgt=rgt.front();
    15                 if( (curlft->left==NULL&&currgt->right!=NULL) ||
    16                     (curlft->right==NULL&&currgt->left!=NULL) ) return false;
    17                 if(curlft->left!=NULL&&
    18                    currgt->right!=NULL&&
    19                    curlft->left->val!=currgt->right->val)   return false;
    20                 if(curlft->right!=NULL&&
    21                    currgt->left!=NULL&&
    22                    curlft->right->val!=currgt->left->val)   return false;
    23                 if(curlft->left!=NULL)  lft.push(curlft->left);
    24                 if(curlft->right!=NULL) lft.push(curlft->right);
    25                 if(currgt->right!=NULL) rgt.push(currgt->right);
    26                 if(currgt->left!=NULL)  rgt.push(currgt->left);
    27                 lft.pop();
    28                 rgt.pop();
    29             }
    30         }
    31         return true;
    32     }
    33 };
    View Code
      一个是queue 中维护未判断的,包括NULL,这样写逻辑比较简单。
     1 #include <iostream>
     2 #include <queue>
     3 using namespace std;
     4 /**
     5  * Definition for binary tree
     6  */
     7 struct TreeNode {
     8     int val;
     9     TreeNode *left;
    10     TreeNode *right;
    11     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    12 };
    13 /**
    14 class Solution {
    15 public:
    16     bool isSymmetric(TreeNode *root) {
    17         if(root==NULL||(root->left==NULL&&root->right==NULL))  return true;
    18         if(root->left==NULL||root->right==NULL||root->left->val!=root->right->val)   return false;
    19         queue<TreeNode*> lft;
    20         lft.push(root->left);
    21         queue<TreeNode*> rgt;
    22         rgt.push(root->right);
    23         while(( !lft.empty() )||( !rgt.empty() )){
    24             int nlft=lft.size(),nrgt=rgt.size();
    25             if(nlft!=nrgt)  return false;
    26             for(int i=0;i<nlft;i++){
    27                 TreeNode* curlft=lft.front(),*currgt=rgt.front();
    28                 if( (curlft->left==NULL&&currgt->right!=NULL) ||
    29                     (curlft->right==NULL&&currgt->left!=NULL) ) return false;
    30                 if(curlft->left!=NULL&&
    31                    currgt->right!=NULL&&
    32                    curlft->left->val!=currgt->right->val)   return false;
    33                 if(curlft->right!=NULL&&
    34                    currgt->left!=NULL&&
    35                    curlft->right->val!=currgt->left->val)   return false;
    36                 if(curlft->left!=NULL)  lft.push(curlft->left);
    37                 if(curlft->right!=NULL) lft.push(curlft->right);
    38                 if(currgt->right!=NULL) rgt.push(currgt->right);
    39                 if(currgt->left!=NULL)  rgt.push(currgt->left);
    40                 lft.pop();
    41                 rgt.pop();
    42             }
    43         }
    44         return true;
    45     }
    46 };
    47 */
    48 
    49 class Solution {
    50 public:
    51     bool isSymmetric(TreeNode *root) {
    52         if(root==NULL)  return true;
    53         queue<TreeNode* > lft,rgt;
    54         lft.push(root->left);
    55         rgt.push(root->right);
    56         while((!lft.empty())||(!rgt.empty())){
    57             TreeNode * curlft=lft.front(),*currgt=rgt.front();
    58             lft.pop();
    59             rgt.pop();
    60             if(curlft==NULL&&currgt==NULL)  continue;
    61             if(curlft==NULL||currgt==NULL||curlft->val!=currgt->val)  return false;
    62             lft.push(curlft->left);
    63             lft.push(curlft->right);
    64             rgt.push(currgt->right);
    65             rgt.push(currgt->left);
    66         }
    67         return true;
    68     }
    69 };
    70 
    71 int main()
    72 {
    73 
    74     return 0;
    75 }
    View Code
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    解压tar.gz文件报错gzip: stdin: not in gzip format解决方法
    通过 HTTP 头进行 SQL 注入(转)
    Android涉及到的设计模式(转)
    初探Java8中的HashMap(转)
    substance的使用示例(转)
    大数据量下高并发同步的讲解(不看,保证你后悔)(转)
    HDU 4812 D Tree 树分区+逆+hash新位置
    在weblogic11g发布该项目时遇到错误(不支持web-app_3_0)
    highchart几个图表马金摘要
    android 使用 service 实现音乐
  • 原文地址:https://www.cnblogs.com/Azhu/p/4162106.html
Copyright © 2011-2022 走看看