• [面试真题] LeetCode:Symmetric Tree


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

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

    解法 1:非递归解法

    使用双端队列dequeue记录对称的节点,依次从dequeue的头尾取出两个节点进行判断,两个节点的值以及节点左右孩子结构分别相同的情况下,将他们的孩子按顺序加入dequeue。再依次从dequeue的头尾取出两个节点进行判断,直到dequeue为空。

     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         // Start typing your C/C++ solution below
    14         // DO NOT write int main() function
    15         if(NULL == root){
    16             return true;
    17         }
    18         if((root->left && !root->right) || (!root->left && root->right)){
    19             return false;
    20         }
    21         if(!root->left && !root->right){
    22             return true;
    23         }
    24         if(root->left->val != root->right->val){
    25             return false;
    26         }
    27         deque<TreeNode*> dq;
    28         dq.push_front(root->left);
    29         dq.push_back(root->right);
    30         while(dq.size()){
    31             TreeNode *l = dq.front();
    32             dq.pop_front();
    33             TreeNode *r = dq.back();
    34             dq.pop_back();
    35             if(l->val != r->val){
    36                 return false;
    37             }
    38             if(l->left && r->right){
    39                 dq.push_front(l->left);
    40                 dq.push_back(r->right);
    41             }else if((l->left && !r->right) || (!l->left && r->right)){
    42                 return false;
    43             }
    44             if(l->right && r->left){
    45                 dq.push_front(l->right);
    46                 dq.push_back(r->left);
    47             }else if((l->right && !r->left) || (!l->right && r->left)){
    48                 return false;
    49             }
    50         }
    51         return true;
    52     }
    53 };

    Run Status: Accepted!

    Program Runtime: 20 milli secs

    Progress: 190/190 test cases passed.
     

    解法 2:递归解法

     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     bool isSymmetric(TreeNode *left, TreeNode *right) {
    12         if(left && right){
    13             if(left->val != right->val){
    14                 return false;
    15             }
    16         }
    17         if((left && !right) || (!left && right)){
    18             return false;
    19         }
    20         if(!left && !right){
    21             return true;
    22         }
    23         if(left->left){
    24             if(!right->right){
    25                 return false;
    26             }else{
    27                 if(left->left->val != right->right->val){
    28                     return false;    
    29                 }
    30             }
    31         }else{
    32             if(right->right){
    33                 return false;
    34             }
    35         }
    36         if(left->right){
    37             if(!right->left){
    38                 return false;
    39             }else{
    40                 if(left->right->val != right->left->val){
    41                    return false; 
    42                 }
    43             }
    44         }else{
    45             if(right->left){
    46                 return false;
    47             }
    48         }
    49         return (left->left ? isSymmetric(left->left, right->right) : true) && (left->right ? isSymmetric(left->right, right->left) : true);
    50     }
    51         
    52 public:
    53     bool isSymmetric(TreeNode *root) {
    54         // Start typing your C/C++ solution below
    55         // DO NOT write int main() function
    56         if(NULL == root){
    57             return true;
    58         }
    59         return isSymmetric(root->left, root->right);
    60     }
    61 };

    Run Status: Accepted!
    Program Runtime: 24 milli secs

    Progress: 190/190 test cases passed.
     
  • 相关阅读:
    poj 3378 Crazy Thairs 夜
    1487. Chinese Football 夜
    容斥原理
    Dancing Links
    三角剖分
    模线性方程模板
    模线性方程
    容斥原理 POJ2773
    DNA Sequence [矩阵]
    hdu 2588 容斥
  • 原文地址:https://www.cnblogs.com/infinityu/p/3073981.html
Copyright © 2020-2023  润新知