• 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.

    个人思路:

    1、注意到根节点的左右子树是对称的,且对称方向是左右对称,那么选取根节点的任意一颗子树,这里我选取右子树

    2、将右子树中的所有父节点的左右子节点互换,如果原来的树是一颗镜像树,那么右子树经过这么处理后便与左子树相同,因此,只需要将处理之后的右子树与原来的左子树对比是否相同,若相同,则原树是镜像树,否则不是镜像树

    代码:

     1 #include <stddef.h>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 struct TreeNode
     7 {
     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 {
    16 public:
    17     bool isSymmetric(TreeNode *root)
    18     {
    19         if (root == NULL || (root->left == NULL && root->right == NULL))
    20         {
    21             return true;
    22         }
    23         if ((root->left == NULL && root->right != NULL) || (root->right == NULL && root->left != NULL))
    24         {
    25             return false;
    26         }
    27         //根节点及其左右子节点均不为空
    28         swapLeftRight(root->right);
    29 
    30         return isSameTree(root->left, root->right);
    31     }
    32 private:
    33     void swapLeftRight(TreeNode *root)
    34     {
    35         if (root == NULL)
    36         {
    37             return;
    38         }
    39 
    40         TreeNode *tmp = root->right;
    41         root->right = root->left;
    42         root->left = tmp;
    43 
    44         swapLeftRight(root->left);
    45         swapLeftRight(root->right);
    46     }
    47     bool isSameTree(TreeNode *first, TreeNode *second)
    48     {
    49         if (first == NULL && second == NULL)
    50         {
    51             return true;
    52         }
    53         if (first != NULL && second != NULL)
    54         {
    55             return first->val == second->val && isSameTree(first->left, second->left) && isSameTree(first->right, second->right);
    56         }
    57 
    58         return false;
    59     }
    60 };
    61 
    62 int main()
    63 {
    64     Solution s;
    65     TreeNode *root = new TreeNode(1);
    66     root->left = new TreeNode(2);
    67     root->right = new TreeNode(2);
    68     //root->left->left = new TreeNode(3);
    69     root->left->right = new TreeNode(3);
    70     //root->right->left = new TreeNode(4);
    71     root->right->right = new TreeNode(3);
    72 
    73     cout << s.isSymmetric(root) << endl;
    74 
    75     system("pause");
    76 
    77     return 0;
    78 }
    View Code

    上网搜了一些帖子,发现我的方法过于麻烦,可以处理地更简单些,链接:http://www.cnblogs.com/remlostime/archive/2012/11/15/2772230.html,这是递归的算法,思路是从根节点的左右子节点开始判断,判断左右子节点值,再判断左节点的左子树与右节点的右子树是否相同,以及左节点的右子树与右节点的左子树是否相同

    代码:

      1 #include <stddef.h>
      2 #include <iostream>
      3 
      4 using namespace std;
      5 
      6 struct TreeNode
      7 {
      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 {
     16 public:
     17     bool isSymmetric(TreeNode *root)
     18     {
     19         /*
     20         if (root == NULL || (root->left == NULL && root->right == NULL))
     21         {
     22             return true;
     23         }
     24         if ((root->left == NULL && root->right != NULL) || (root->right == NULL && root->left != NULL))
     25         {
     26             return false;
     27         }
     28         //根节点及其左右子节点均不为空
     29         swapLeftRight(root->right);
     30 
     31         return isSameTree(root->left, root->right);
     32         */
     33 
     34         if (root == NULL)
     35         {
     36             return true;
     37         }
     38 
     39         return isSame(root->left, root->right);
     40     }
     41 private:
     42     bool isSame(TreeNode *left, TreeNode *right)
     43     {
     44         if (left == NULL && right == NULL)
     45         {
     46             return true;
     47         }
     48         if (left == NULL || right == NULL)
     49         {
     50             return false;
     51         }
     52 
     53         return left->val == right->val && isSame(left->left, right->right) && isSame(left->right, right->left);
     54     }
     55     void swapLeftRight(TreeNode *root)
     56     {
     57         if (root == NULL)
     58         {
     59             return;
     60         }
     61 
     62         TreeNode *tmp = root->right;
     63         root->right = root->left;
     64         root->left = tmp;
     65 
     66         swapLeftRight(root->left);
     67         swapLeftRight(root->right);
     68     }
     69     bool isSameTree(TreeNode *first, TreeNode *second)
     70     {
     71         if (first == NULL && second == NULL)
     72         {
     73             return true;
     74         }
     75         if (first != NULL && second != NULL)
     76         {
     77             return first->val == second->val && isSameTree(first->left, second->left) && isSameTree(first->right, second->right);
     78         }
     79 
     80         return false;
     81     }
     82 };
     83 
     84 int main()
     85 {
     86     Solution s;
     87     TreeNode *root = new TreeNode(1);
     88     root->left = new TreeNode(2);
     89     root->right = new TreeNode(2);
     90     //root->left->left = new TreeNode(3);
     91     root->left->right = new TreeNode(3);
     92     //root->right->left = new TreeNode(4);
     93     root->right->right = new TreeNode(3);
     94 
     95     cout << s.isSymmetric(root) << endl;
     96 
     97     system("pause");
     98 
     99     return 0;
    100 }
    View Code

    非递归的算法,链接:http://blog.csdn.net/sunbaigui/article/details/8981333

    思路:

    1、类似层次遍历的方法,根节点的左右子树分别进行各自的层次遍历,且相同层次上的遍历顺序相反

    2、左子树从左往右,右子树从右往左,如果原树是镜像树,那么遍历出来的节点以及节点值应该相同,否则不是镜像树

    代码:

      1 #include <stddef.h>
      2 #include <iostream>
      3 #include <queue>
      4 
      5 using namespace std;
      6 
      7 struct TreeNode
      8 {
      9     int val;
     10     TreeNode *left;
     11     TreeNode *right;
     12     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     13 };
     14 
     15 class Solution
     16 {
     17 public:
     18     bool isSymmetric(TreeNode *root)
     19     {
     20         /*
     21         if (root == NULL || (root->left == NULL && root->right == NULL))
     22         {
     23             return true;
     24         }
     25         if ((root->left == NULL && root->right != NULL) || (root->right == NULL && root->left != NULL))
     26         {
     27             return false;
     28         }
     29         //根节点及其左右子节点均不为空
     30         swapLeftRight(root->right);
     31 
     32         return isSameTree(root->left, root->right);
     33         */
     34         /*
     35         if (root == NULL)
     36         {
     37             return true;
     38         }
     39 
     40         return isSame(root->left, root->right);
     41         */
     42 
     43         if (root == NULL)
     44         {
     45             return true;
     46         }
     47 
     48         queue<TreeNode *> left, right;
     49         left.push(root->left);
     50         right.push(root->right);
     51 
     52         while (!left.empty() && !right.empty())
     53         {
     54             TreeNode *leftNode = left.front();
     55             TreeNode *rightNode = right.front();
     56             left.pop();
     57             right.pop();
     58 
     59             if (leftNode == NULL && rightNode == NULL)
     60             {
     61                 continue;
     62             }
     63             if (leftNode == NULL || rightNode == NULL)
     64             {
     65                 return false;
     66             }
     67             if (leftNode->val != rightNode->val)
     68             {
     69                 return false;
     70             }
     71 
     72             left.push(leftNode->left);
     73             left.push(leftNode->right);
     74             right.push(rightNode->right);
     75             right.push(rightNode->left);
     76         }
     77 
     78         return true;
     79 
     80     }
     81 private:
     82     bool isSame(TreeNode *left, TreeNode *right)
     83     {
     84         if (left == NULL && right == NULL)
     85         {
     86             return true;
     87         }
     88         if (left == NULL || right == NULL)
     89         {
     90             return false;
     91         }
     92 
     93         return left->val == right->val && isSame(left->left, right->right) && isSame(left->right, right->left);
     94     }
     95     void swapLeftRight(TreeNode *root)
     96     {
     97         if (root == NULL)
     98         {
     99             return;
    100         }
    101 
    102         TreeNode *tmp = root->right;
    103         root->right = root->left;
    104         root->left = tmp;
    105 
    106         swapLeftRight(root->left);
    107         swapLeftRight(root->right);
    108     }
    109     bool isSameTree(TreeNode *first, TreeNode *second)
    110     {
    111         if (first == NULL && second == NULL)
    112         {
    113             return true;
    114         }
    115         if (first != NULL && second != NULL)
    116         {
    117             return first->val == second->val && isSameTree(first->left, second->left) && isSameTree(first->right, second->right);
    118         }
    119 
    120         return false;
    121     }
    122 };
    123 
    124 int main()
    125 {
    126     Solution s;
    127     TreeNode *root = new TreeNode(1);
    128     root->left = new TreeNode(2);
    129     root->right = new TreeNode(2);
    130     //root->left->left = new TreeNode(3);
    131     root->left->right = new TreeNode(3);
    132     //root->right->left = new TreeNode(4);
    133     root->right->right = new TreeNode(3);
    134 
    135     cout << s.isSymmetric(root) << endl;
    136 
    137     system("pause");
    138 
    139     return 0;
    140 }
    View Code
  • 相关阅读:
    SQL中的字符串字段根据某字段实现自增
    SQL中的字符串字段实现自增
    ECS Windows服务器IIS FTP登陆提示“530 valid hostname is expected”
    HTML中动态生成内容的事件绑定问题
    JavaScript对JSON数据进行排序和搜索
    IIS站点下多应用程序 C#获取根目录方法
    asp.net中form表单多个按钮submit提交到后台的实例
    C#从一个SqlCommand对象生成可执行的SQL语句
    传递参数
    js创建jsonArray传输至后台及后台解析
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3796413.html
Copyright © 2020-2023  润新知