[LeetCode OJ] 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
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的更多相关文章
- LeetCode OJ Symmetric Tree 判断是否为对称树(AC代码)
思路: 主要判断左子树与右子树. 在判断左时,循环下去肯定会到达叶子结点中最左边的结点与最右边的结点比较. 到了这一步因为他们都没有左(右)子树了,所以得开始判断这两个结点的右(左)子树了. 当某 ...
- 【leetcode】Symmetric Tree
Symmetric Tree Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its ...
- 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的
题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ...
- [leetcode] 101. Symmetric Tree 对称树
题目大意 #!/usr/bin/env python # coding=utf-8 # Date: 2018-08-30 """ https://leetcode.com ...
- Leetcode 101 Symmetric Tree 二叉树
判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...
- [leetcode] 10. Symmetric Tree
这次我觉得我的智商太低,想了很久才写出来.题目是让求镜像二叉树判断,题目如下: Given a binary tree, check whether it is a mirror of itself ...
- [LeetCode 题解]: Symmetric Tree
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a ...
- LeetCode 101. Symmetric Tree (对称树)
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- (二叉树 DFS 递归) leetcode 101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
随机推荐
- 制作手机浏览器显示格式的HTML页面
最近要推出手机支持访问的HTML页面效果,而这在制作手机页面的过程中状况连连. 主要一下就我制作的工程中所遇的问题说明一下: 1. 改掉HTML页面声明:(以往大部分页面都是HTML4.0的声明) 还 ...
- implicitly_wait()隐式等待
# -*- coding:utf-8 -*- """ implicitly_wait():隐式等待 当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM ...
- 【Objective-C基础教程-读书笔记】第1章 启程
在第1章里面,作者主要以一种站在世界中心呼唤爱的姿态,给读者们打打鸡血洗洗脑,鼓励大家,投入时间学习Objective-C,值得啊! 首先,Objective-C既能用来开发OS X平台上的APP,又 ...
- 编译android的linux kernel goldfish
https://source.android.com/source/building-kernels.html $ export PATH=/home/hzh/oldhome/learn/androi ...
- Java 内存泄露的理解与解决过程
本文详细地介绍了Java内存管理的原理,以及内存泄露产生的原因,同时提供了一些列解决Java内存泄露的方案,希望对各位Java开发者有所帮助. Java内存管理机制 在C++ 语言中,如果需要动态分配 ...
- 第十七章、程序管理与 SELinux 初探 工作管理 (job control)
工作管理 (job control) 这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登陆系统取得 bash shell 之后,在单一终端机介面下同时进行多个工 ...
- Little Kings - SGU 223(状态压缩)
题目大意:在一个N*N的棋盘上放置M个国王,已知国王会攻击与它相邻的8个格子,要求放置的额国王不能相互攻击,求放置的方式有多少种. 分析:用dp[row][state][nOne],表示本行状态sta ...
- 挣值管理不是搞数字游戏(3)——进阶指标:CV、SV、CPI、SPI、EAC
摘要: 要考PMP(Project Management Professional ),挣值管理是必考的知识.软件项目有很大的特殊性,不少人认为挣值管理不太适用于软件项目.挣值管理相关资料也比较超多, ...
- kafka配额控制
转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5217754.html Starting in 0.9, the Kafka cluster has th ...
- C# 数组排序 基本算法 分类: C# 2014-09-25 15:43 129人阅读 评论(0) 收藏
说明:冒泡.直接插入.选择.自带方法四中基本排序算法. using System; using System.Collections.Generic; using System.ComponentMo ...