• 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
    


    刚开始看这道题,感觉层序遍历可行,当时觉得递归不可行,想了用队列还是双向队列还是vector。= =
    后来才发现层序遍历不可行啊,你看第二个例子满足层序遍历的结果是回文(本来想用层序遍历+回文)然而并不是对称树。
    后来就觉得用递归,但是递归最重要的就是思想,想了很久不知道该怎么递归。
    如果是递归的话,根节点的情况应该是例外的啊。陷入沉思,总之节点都是两两比较,应该构建一个两两比较的函数。于是构建了isReverse函数,判断两个树是不是对称的。
    具体的思想说不上来,就是自己画了一个例子,然后想到底要判断哪些节点。

     1 /**
     2  * Definition for a binary tree node.
     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 isReverse(TreeNode* p,TreeNode* q){
    13         if(p==NULL||q==NULL){
    14             if(p==NULL&&q==NULL) return true;
    15             else return false;
    16         }
    17         else{ 
    18             if(p->val==q->val) 
    19                 return isReverse(p->left,q->right)&&isReverse(p->right,q->left);
    20             else return false;
    21         }
    22     }
    23     
    24     bool isSymmetric(TreeNode* root) {
    25         if(root==NULL) return true;
    26         return isReverse(root->left,root->right);
    27         }
    28         
    29 };




    补充一点关于堆和栈的知识:

    1、stack
    stack 模板类的定义在<stack>头文件中。
    stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要
    的,在不指定容器类型时,默认的容器类型为deque。
    定义stack 对象的示例代码如下:
    stack<int> s1;
    stack<string> s2;
    stack 的基本操作有:
    入栈,如例:s.push(x);
    出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
    访问栈顶,如例:s.top()
    判断栈空,如例:s.empty(),当栈空时,返回true。
    访问栈中的元素个数,如例:s.size()。

    2、queue
    queue 模板类的定义在<queue>头文件中。
    与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类
    型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
    定义queue 对象的示例代码如下:
    queue<int> q1;
    queue<double> q2;

    queue 的基本操作有:
    入队,如例:q.push(x); 将x 接到队列的末端。
    出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
    访问队首元素,如例:q.front(),即最早被压入队列的元素。
    访问队尾元素,如例:q.back(),即最后被压入队列的元素。
    判断队列空,如例:q.empty(),当队列空时,返回true。
    访问队列中的元素个数,如例:q.size()

     
  • 相关阅读:
    变色DNA(最短路思维题)
    Clairewd’s message(哈希模板+)
    Built(最小生成树+构图离散化)
    Palindrome Degree(hash的思想题)
    字符串哈希算法(以ELFHash详解)
    Making Genome in Berland (DFS+思维)
    统计难题(字典树模板)
    Buy Tickets(线段树单点更新,逆向思维)
    fPzByjvwjL
    Beauty of Array ZOJ
  • 原文地址:https://www.cnblogs.com/LUO77/p/4988269.html
Copyright © 2020-2023  润新知