这道题是LeetCode里的第101道题。是我在学数据结构——二叉树的时候碰见的题。

题目如下:

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

     1
/ \
2 2
/ \ / \
3 4 4 3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
/ \
2 2
\ \
3 3

说明:

你可以运用递归和迭代两种方法解决这个问题。

解题思路:

读完题目后我首先想到的是用遍历的方法来解题,树的遍历有三种:前序遍历,中序遍历和后序遍历。

这里我选择的是中序遍历,对根节点的左右子树分别进行中序遍历,但是因为要符合题目的要求——对称,所以两种中序遍历的方式不一样,根节点左子树采用LDR中序遍历,根节点右子树采用RDL中序遍历。

如同上面的两个示例:第一颗树根节点的左子树遍历结果是[3,2,4],而根节点的右子树遍历结果是[3,2,4],相等。对称。

第二颗树根节点的左子树遍历结果是[2,3],而根节点的右子树遍历结果是[3,2],不相等。不对称。

代码如下:

 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> LPreOrder(TreeNode* tree){//LDR中序遍历
stack<TreeNode*>st;//节点堆栈
vector<int>res;
TreeNode* pt;
if(tree==NULL)return res;
pt=tree;
while(pt!=NULL||st.size()!=){
while(pt!=NULL){//先访问左节点
st.push(pt);
pt=pt->left;
}
pt=st.top();//最下边的左节点
res.push_back(pt->val);//保存数值
st.pop();
pt=pt->right;//访问右节点
}
return res;
}
vector<int> RPreOrder(TreeNode* tree){//RDL中序遍历
stack<TreeNode*>st;
vector<int>res;
TreeNode* pt;
if(tree==NULL)return res;
pt=tree;
while(pt!=NULL||st.size()!=){
while(pt!=NULL){
st.push(pt);
pt=pt->right;
}
pt=st.top();
res.push_back(pt->val);
st.pop();
pt=pt->left;
}
return res;
}
bool isSymmetric(TreeNode* root) {
if(root==NULL)//根节点是否为空
return true;
if(root->left==NULL||root->right==NULL){//左右子树其中一个是否为空
if(root->left==NULL&&root->right==NULL)//左右子树是否为空
return true;
return false;
}
else{
if(root->left->val!=root->right->val)return false;
vector<int>Lorder,Rorder;
Lorder=LPreOrder(root->left);//遍历
Rorder=RPreOrder(root->right);//遍历
if(Lorder!=Rorder)return false;//判断遍历结果是否相同
return true;
}
}
};

运行结果:

​​

测试结果通过。。。

这其实这还没结束,因为如果是这颗树的话(自己突然想到的):

​​

很明显不对称是不是,但是仍然能通过测试,就说明在测试案例里没有这颗树。钻了个空子。

然后我没办法只好用官方解题思路:

就是使用双节点递归对每一个节点及其相对称的节点进行左右对称判断。类似于广度优先算法,或是层次遍历。

 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isMirror(TreeNode* t1,TreeNode* t2){
if(t1==NULL&&t2==NULL)return true;
if(t1==NULL||t2==NULL)return false;
return (t1->val==t2->val)
&&isMirror(t1->left,t2->right)
&&isMirror(t2->left,t1->right);
}
bool isSymmetric(TreeNode* root) {
return isMirror(root,root);
}
};

是不是看起了简单多了?我也学习到了。

个人总结:写算法不能只光顾一个案例,要善于使用各种特殊的案例来测试算法的正确性和可行性,在这里我就是在编写过程中没有充分考虑到空节点的情况,导致了多次提交的错误。

【LeetCode】Symmetric Tree(对称二叉树)的更多相关文章

  1. [Leetcode] Symmetric tree 对称二叉树

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

  2. 【LeetCode】101. Symmetric Tree 对称二叉树(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 [LeetCode] 题目地址 ...

  3. 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现

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

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

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

  5. LeetCode: Symmetric Tree 解题报告

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

  6. LeetCode【101. 对称二叉树】

    对称二叉树,就是左节点的左节点等于右节点的右节点,左节点的右节点等于右节点的左节点. 很自然就想到迭代与递归,可以创建一个新的函数,就是另一个函数不断的判断,返回在主函数. class Solutio ...

  7. [LeetCode] Symmetric Tree 判断对称树

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

  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. 第28题:leetcode101:Symmetric Tree对称的二叉树

    给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...

随机推荐

  1. [已读]精通AngularJS

    觉得可以看第二遍,内容其实还不错啦,就是翻译会有点生硬.

  2. box-shadow四周阴影

    box-shadow 前面两个值为 纵向阴影 和 横向阴影 把这两个值都设置为 0 就是四边都有阴影 border:#074A99 0px solid; box-shadow: 0 0 10px #0 ...

  3. 随机不重复的取数组元素,并赋值给div使用

    function pos(){ var items = $('.starone'); items.each(function () { var rand = getRandom(); $(this). ...

  4. java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx/lib/arm/liblame.so: has text relocations

    最近在写本地录音转码过程中引入了liblame.so,我这边用了不同系统版本的手机测试本地录音都没有出现问题,但是有一天,同事在测试的时候,出现了以下错误: 09-13 17:32:29.140 26 ...

  5. 基于H5+ API手机相册图片压缩上传

    // 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照 ...

  6. Java文件操作系列[2]——使用JXL操作Excel文件

    由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别 ...

  7. POJ 1155 TELE (树形DP,树形背包)

    题意:给定一棵树,n个节点,其中有m个叶子表示的是用户,其他点表示中转器, 每条边都有权值,每个用户i愿意给的钱w[i],问如果在不亏钱的情况下能为多少用户转播足球比赛? 思路: 其实就是要选出部分叶 ...

  8. HDU 4341 Gold miner (分组背包)

    先把线按照距离原点的距离排序,然后用叉积把在同一条直线上的点放在一起, 把在同一条线上的点中的前i个点当成一个点就转化成了分组背包. 写if(kas++) putchar('\n') 居然PE了,PE ...

  9. 手把手教你写 Vue UI 组件库

    最近在研究 muse-ui 的实现,发现网上很少有关于 vue 插件具体实现的文章,官方的文档也只是一笔带过,对于新手来说并不算友好. 笔者结合官方文档,与自己的摸索总结,以最简单的 FlexBox  ...

  10. Scrapy-架构

    Scrapy架构(各组件的功能)及Scrapy引擎控制数据流的过程 1. Scrapy架构图(绿线是数据流向): □ Scrapy引擎(Engine):引擎负责控制数据流在系统的所有组件中流动,并在相 ...