zoukankan      html  css  js  c++  java
  • 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);
        }
    };
  • 相关阅读:
    [java] 深入理解内部类: inner-classes
    [java] 更好的书写equals方法-汇率换算器的实现(4)
    [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3
    [java] jsoup使用简介-汇率换算器实现-插曲2
    [java] 汇率换算器实现(3)
    [java] 汇率换算器实现-插曲1-正则表达式(1)
    [java] 汇率换算器实现(2)
    [java] 汇率换算器实现(1)
    [Basic] The most basic things about java
    电路相关知识–读<<继电器是如何成为CPU的>>
  • 原文地址:https://www.cnblogs.com/lailailai/p/3638520.html
Copyright © 2011-2022 走看看