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.

confused what "{1,#,2,3}" means?

方法一:递归实现

 /**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
bool canBeSymmetric(TreeNode *p, TreeNode *q)
{
if(p==NULL && q==NULL)
return true;
if((p==NULL && q!=NULL) || (p!=NULL && q==NULL))
return false; if(p->val != q->val)
return false;
bool b1 = canBeSymmetric(p->left, q->right); //若二叉树p和二叉树q对称,则 p 的左子树和 q 的右子树对称
if(b1==false)
return false;
bool b2 = canBeSymmetric(p->right, q->left); //若二叉树p和二叉树q对称,则 p 的右子树和 q 的左子树对称 return b2; } class Solution {
public:
bool isSymmetric(TreeNode *root) { if(root==NULL)
return true; return canBeSymmetric(root->left, root->right);
}
};

方法二:迭代实现

 /**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
vector<int> PreOrderTraverse(TreeNode *p) //按根左右的顺序遍历二叉树,迭代实现
{
vector<int> result;
stack<TreeNode*> st; while(p || !st.empty())
{
if(p)
{
result.push_back(p->val);
st.push(p);
p = p->left;
}
else
{
result.push_back(); //用0表示空树
p = st.top();
st.pop();
p = p->right;
}
}
result.push_back();
return result;
} vector<int> ReversePreOrderTraverse(TreeNode *p) //按根右左的顺序遍历二叉树,迭代实现
{
vector<int> result;
stack<TreeNode*> st; while(p || !st.empty())
{
if(p)
{
result.push_back(p->val);
st.push(p);
p = p->right;
}
else
{
result.push_back(); //用0表示空树
p = st.top();
st.pop();
p = p->left;
}
}
result.push_back();
return result;
} class Solution {
public:
bool isSymmetric(TreeNode *root) { if(root==NULL)
return true; vector<int> ivec1 = PreOrderTraverse(root->left);
vector<int> ivec2 = ReversePreOrderTraverse(root->right); return ivec1==ivec2;
}
};

注:

发现对于两棵完全相同的二叉树,用"#"(方法二中是用整数0,也可以用其他的代替)代替空树,他们的先序遍历序列是完全相同的,

反之也成立,即若两颗二叉树的先序遍历序列(用"#"代替空树)完全相同,那么这两颗二叉树也必然相同

然而这一事实对于用中序遍历序列则不成立,也就是说若两颗二叉树的中序遍历序列(用"#"代替空树)完全相同,这两颗二叉树不一定相同。举例如下:

  2
/ 的中序遍历序列(左根右)为: #3#2# 先序遍历序列(根左右)为: 23### 后序遍历序列(左右根)为: ##3#2
3
不同 相同 不同 不同
 3
\ 的中序遍历序列(左根右)为: #3#2# 先序遍历序列(根左右)为: 3#2## 后序遍历序列(左右根)为: ###23
2 这两颗树不同,但他们对应的中序遍历序列却相同。

[LeetCode OJ] Symmetric Tree的更多相关文章

  1. LeetCode OJ Symmetric Tree 判断是否为对称树(AC代码)

      思路: 主要判断左子树与右子树. 在判断左时,循环下去肯定会到达叶子结点中最左边的结点与最右边的结点比较. 到了这一步因为他们都没有左(右)子树了,所以得开始判断这两个结点的右(左)子树了. 当某 ...

  2. 【leetcode】Symmetric Tree

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

  3. 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的

    题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ...

  4. [leetcode] 101. Symmetric Tree 对称树

    题目大意 #!/usr/bin/env python # coding=utf-8 # Date: 2018-08-30 """ https://leetcode.com ...

  5. Leetcode 101 Symmetric Tree 二叉树

    判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...

  6. [leetcode] 10. Symmetric Tree

    这次我觉得我的智商太低,想了很久才写出来.题目是让求镜像二叉树判断,题目如下: Given a binary tree, check whether it is a mirror of itself ...

  7. [LeetCode 题解]: Symmetric Tree

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述   Given a ...

  8. LeetCode 101. Symmetric Tree (对称树)

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

  9. (二叉树 DFS 递归) leetcode 101. Symmetric Tree

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

随机推荐

  1. 凯撒密码 CH Round #57 - Story of the OI Class

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/凯撒密码 题解:刚开始想map, ...

  2. Linux Shell编程(20)——基本命令

    新手必须要掌握的初级命令ls基本的列出所有文件的命令.但是往往就是因为这个命令太简单,所以我们总是低估它.比如,用 -R 选项,这是递归选项,ls 将会以目录树的形式列出所有文件, 另一个很有用的选项 ...

  3. oracle自动编号

    oracle自动编号 在access中有自动编号的数据类型,MSSQL和MYSQL也都有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值,而oracle没有自动增长的数据类型,我们需要建 ...

  4. vimium快捷键列表

    最近越来越懒了,不想拿手去碰鼠标,就想这样放在键盘上,在MacOSX下基本的操作也都能实现了,Xcode也没什么问题,现在就是有个地方十分不方便,就是浏览网页的问题,不管怎么样都是需要鼠标来浏览网页, ...

  5. AXI总线

    AXI(Advanced eXtensible Interface)是一种总协议,该协议是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture) ...

  6. iptables vpn

  7. 天津Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. C# ToString格式大全

      C# 货币  2.5.ToString("C"); // ¥2.50 // D 10进制数 25.ToString("D5"); // 25000 // E ...

  9. kafka consumer频繁reblance

    转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5417956.html 结论与下文相同,kafka不同topic的consumer如果用的groupid名 ...

  10. 浅谈qmake之pro、pri、prf、prl文件

    浅谈qmake之pro.pri.prf.prl文件 转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来 ...