【LeetCode】Symmetric Tree(对称二叉树)
这道题是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(对称二叉树)的更多相关文章
- [Leetcode] Symmetric tree 对称二叉树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- 【LeetCode】101. Symmetric Tree 对称二叉树(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 [LeetCode] 题目地址 ...
- 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- [leetcode] 101. Symmetric Tree 对称树
题目大意 #!/usr/bin/env python # coding=utf-8 # Date: 2018-08-30 """ https://leetcode.com ...
- LeetCode: Symmetric Tree 解题报告
Symmetric Tree Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its ...
- LeetCode【101. 对称二叉树】
对称二叉树,就是左节点的左节点等于右节点的右节点,左节点的右节点等于右节点的左节点. 很自然就想到迭代与递归,可以创建一个新的函数,就是另一个函数不断的判断,返回在主函数. class Solutio ...
- [LeetCode] Symmetric Tree 判断对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- [leetcode]101. Symmetric Tree对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- 第28题:leetcode101:Symmetric Tree对称的二叉树
给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...
随机推荐
- Executor等系列概念介绍
这里对几个常见的的名词进行介绍 Executor 这是个接口,只声明了一个方法—— public interface Executor { void execute(Runnable command) ...
- python_22(Form-CRM)
第1章 CRM 1.1 建项目 1.2 settings1.3 规范url 1.4 公共的后台模板1.5 创建部门表 1.6 建库移库 1.7 母版继承 1.7.1 导入static 1.7.2 导入 ...
- Centos 7.5源码编译安装zabbix4.0报fatal error: mysql.h: No such file or directory
系统环境:CentOS 7.5是最小化安装的 编译信息 编译选项: root@Server01 zabbix-]# ./configure --prefix=/usr/share/applicatio ...
- Codeigniter CI 框架的一些优化思考
前段时间使用CI做了两个小项目,对CI的流程和设计理念也有了一些新的认识.CI架构的一些基本优化这里就不做介绍了,如搬离system 文件夹等. 最近有一个稍微大一点的系统,也准备拿CI来做.设计时遇 ...
- 解决win64无法添加curl扩展的问题
网上试了很多方法都无效,最后直接用phpstudy集成安装包中对应版本的php_curl.dll替换即可
- 【学习笔记】CSS优先级规则
CSS的优先级规则很多地方的说法都是错误的,常见错误说法是inline css>内部样式>外部样式,其实并没有这种规定.真正的CSS优先级确定是通过特性值大小确定的,在特性值大小相同的情况 ...
- 三行命令搞定查询Python安装目录
想为Python添加一个库文件到默认目录,却忘记了Python安装目录. 其实,只要用下面三行命令,就可以轻松得到Python安装路径了. 进入Python >>>import sy ...
- GoAccess参数选项
GoAccess - 1.2 Usage: goaccess [filename] [ options ... ] [-c][-M][-H][-q][-d][...]The following opt ...
- COGS 2084. Asm.Def的基本算法
★☆ 输入文件:asm_algo.in 输出文件:asm_algo.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “有句美国俗语说,如果走起来像鸭子,叫起来像 ...
- codevs 1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description CCC的足球比赛和传统的足球比赛有一点不同, 一次进球当且仅当先后接触到球的 ...