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
    


    刚开始看这道题,感觉层序遍历可行,当时觉得递归不可行,想了用队列还是双向队列还是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()

     
  • 相关阅读:
    通过button提交表单
    jQuery 中的事件绑定与取消绑定
    PHP中的几个重要比较
    PHP常用字符串函数
    PHP之mysql笔记
    Oracle 序列(sequence)
    rownum的使用
    jupyter安装,修改登录密码,启动
    selenium下打开Chrome报错解决
    WebDriver下载地址
  • 原文地址:https://www.cnblogs.com/LUO77/p/4988269.html
Copyright © 2011-2022 走看看