C++ 推断一棵二叉树是否对称
一棵二叉树对称,就是说它假设以根为轴,翻转过去一样。例如以下图所看到的,以虚线为轴。把左边翻转到右边,各顶点及顶点中的值一一相应。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3J0aG9jZW50ZXJDaG9jb2xhdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
注意,它并不要求单独看子树的时候子树也是对称的,例如以下图,单独看左子树时,左子树是不正确称的,单独看右子树时。右子树也是不正确称的,但这棵本身是对称的。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3J0aG9jZW50ZXJDaG9jb2xhdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
要推断一棵二叉树是否对称,那就是推断它的左子树翻转过去是否和右子树一样,注意这里的“一样”包含了值也一样。
以下给出代码,当中的样例中的树,就是第一张图中的那棵树:
#include <iostream>
using namespace std; struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
bool isSymmetric(TreeNode *root) {
if(root==NULL)//假设树为空,对称。返回
return true;
return mySymmetric(root->left,root->right);//否则推断以root为根时。左子树翻转后是否和右子树一样
}
bool mySymmetric(TreeNode *leftChild,TreeNode *rightChild) {
if(leftChild==NULL && rightChild==NULL)//左右子树都为空,对称
return true;
else if(leftChild!=NULL && rightChild==NULL || leftChild==NULL && rightChild!=NULL){//一个空一个非空,则不正确称
return false;
}else{
//否则,再推断
if(mySymmetric(leftChild->left,rightChild->right) //(1)leftChild的左子树和rightChild的右子树对称吗?
&& mySymmetric(leftChild->right,rightChild->left) //(2)leftChild的右子树和rightChild的左子树对称吗?
&& leftChild->val==rightChild->val){ //(3)leftChild和rightChild的值一样吗?
return true;//三个条件都满足,对称
}else
return false;//否则不正确称
}
}
};
int main()
{
//样例
TreeNode root(1);
TreeNode leftChild(2);
TreeNode rightChild(2);
TreeNode leftLeftChild(3);
TreeNode leftRightChild(4);
TreeNode rightLeftChild(4);
TreeNode rightRightChild(3);
root.left=&leftChild;
root.right=&rightChild;
leftChild.left=&leftLeftChild;
leftChild.right=&leftRightChild;
rightChild.left=&rightLeftChild;
rightChild.right=&rightRightChild;
Solution s;
if(true==s.isSymmetric(&root))
cout<<"对称"<<endl;
else
cout<<"不正确称"<<endl;
system("pause");
return 0;
}
以下通过几个简单的图来说明一下。
mySymmetric(leftChild->left,rightChild->right)是计算下图中蓝色方框的部分是否关于对称轴对称:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3J0aG9jZW50ZXJDaG9jb2xhdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3J0aG9jZW50ZXJDaG9jb2xhdGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
别忘了还要比較它们的值是否相等~
C++ 推断一棵二叉树是否对称的更多相关文章
- 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的
题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ...
- 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- Invert a binary tree 翻转一棵二叉树
Invert a binary tree 翻转一棵二叉树 假设有如下一棵二叉树: 4 / \ 2 7 / \ / \ 1 3 6 9翻转后: 4 / \ 7 ...
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所 ...
- 剑指offer58:对称的二叉树。判断一颗二叉树是不是对称的,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的
1 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 2 思路和方法 定义一种遍历算法,先遍历右子结点再遍历左子结点:如对称先序 ...
- 剑指offer38:输入一棵二叉树,求该树的深度
1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...
- 剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点, ...
- LeetCode--判断二叉树是否对称
主要是检查该二叉树是否是自己的一个镜像(也就是以中心轴对称的) 举例来说,下面显示的就是一个对称的二叉树 1 / \ 2 2 / \ / \ 3 4 4 3 下面显示的就不是一个对称的二叉树了 1 / ...
- Interview----将一棵二叉树转换成其镜像
题目:输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点. 用递归和循环两种方法完成树的镜像转换. 例如输入: 8 / ...
随机推荐
- android 读取 raw 中的文件。
file.getParentFile().mkdir(); file.createNewFile(); InputStream inputStream = context.getResources() ...
- Weblogic跨域session冲突解决办法
一.现象: 在WebLogic中,有两个不同域A(端口:9000)和B(端口:8000),应用CA在域A中,应用CB在域B中,进行如下操作: 1.先登录应用CA,再登录应用CB,然后,切换回应用CA, ...
- 犯罪心理第一季/全集Criminal Minds迅雷下载
本季Criminal Minds Season1(2005)看点:<犯罪心理>是CBS在2005年9月22日首播的犯罪剧情系列剧,描述了FBI位于维吉尼亚州匡提科总部下属的BAU(行为分析 ...
- 在EditText中限制输入,自定义样式,监听输入的字符,自动换行
自动获取焦点 <!-- 添加:<requestFocus /> 会自动获取焦点 --> <EditText android:layout_width="matc ...
- Java NIO 的前生今世 之四 NIO Selector 详解
Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一 ...
- PHP工程师笔试题
PHP工程师笔试题 提示:请将答案写在另外一张空白纸上,并在30分钟内完成. PHP 请写出include.require.include_once.require_noce的区别. include是 ...
- C++/Php/Python 语言执行shell命令
编程中经常需要在程序中使用shell命令来简化程序,这里记录一下. 1. C++ 执行shell命令 #include <iostream> #include <string> ...
- OSAL工作机制分析
协议栈代码main()函数分析 ZMain文件->ZMain.c->main() 在这里我们重点了解osal_start_system()函数 int main( void ) { // ...
- [leetcode]Triangle @ Python
原题地址:https://oj.leetcode.com/problems/triangle/ 题意: Given a triangle, find the minimum path sum from ...
- 超简单!80行代码实现Google日历(拖放、移动、AJAX)
介绍 本实例介绍使用DayPilot Lite for ASP.NET MVC library 类来实现类google日历效果. 在线实例 天视图 星期视图 拖放调整 拖放移动 行代码来实现a ...