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
判断一颗树是否对称,首先用递归的方法当然比较容易解决:
/**
* 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 isSymmetric(TreeNode* root) {
if(root == NULL)
return true;
if(!root->left && !root->right)
return true;
if(root->left && !root->right || !root->left && root->right)
return false;
return checkSymmetric(root->left, root->right);
} bool checkSymmetric(TreeNode * left, TreeNode * right)
{
if(!left && !right)
return true;
if(!left && right || left && !right)
return false;
if(left->val != right->val)
return false;
return checkSymmetric(left->left, right->right) && checkSymmetric(left->right, right->left);
}
};
题目还要求用非递归的方式来实现,制造两个队列就可以实现了:
/**
* 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 isSymmetric(TreeNode* root) {
queue<TreeNode *> q1;
queue<TreeNode *> q2;
if(root == NULL) return true;
if(!root->left && !root->right) return true;
if(root->left && !root->right || !root->left && root->right) return false;//val
q1.push(root->left);
q2.push(root->right);
TreeNode * tmpLeft, *tmpRight;
while(!q1.empty() && !q2.empty()){
tmpLeft = q1.front();
tmpRight = q2.front();
q1.pop(), q2.pop();
if(!tmpLeft && !tmpRight)
continue;
if(!tmpLeft && tmpRight || tmpLeft && !tmpRight)
return false;
if(tmpLeft->val != tmpRight->val)
return false;
q1.push(tmpLeft->left);
q1.push(tmpLeft->right);
q2.push(tmpRight->right);
q2.push(tmpRight->left);
}
return q1.empty() && q2.empty();
}
};
java的递归版本如下所示:
public class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
if(root.left == null && root.right == null)
return true;
if(root.left != null && root.right != null)
return checkSymmetric(root.left, root.right);
return false;
}
public boolean checkSymmetric(TreeNode leftNode, TreeNode rightNode){
if(leftNode == null && rightNode == null)
return true;
if(leftNode != null && rightNode != null){
if(leftNode.val == rightNode.val){
return checkSymmetric(leftNode.left, rightNode.right) &&
checkSymmetric(leftNode.right, rightNode.left);
}
else
return false;
}
return false;
}
}
下面是迭代版本,和上面的基本上一样:
public class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> q1 = new LinkedList<TreeNode>();
Queue<TreeNode> q2 = new LinkedList<TreeNode>();
TreeNode p1, p2;
if(root == null)
return true;
q1.add(root.left);
q2.add(root.right);
while(!q1.isEmpty() && !q2.isEmpty()){
p1 = q1.poll();
p2 = q2.poll();
if(p1 == null && p2 == null)
continue;
if(p1 != null && p2 != null){
if(p1.val == p2.val){
q1.add(p1.left);
q1.add(p1.right);
q2.add(p2.right);
q2.add(p2.left);
}else
return false;
}else
return false;
}
return true;
}
}
LeetCode OJ:Symmetric Tree(对称的树)的更多相关文章
- [leetcode] 101. Symmetric Tree 对称树
题目大意 #!/usr/bin/env python # coding=utf-8 # Date: 2018-08-30 """ https://leetcode.com ...
- LeetCode OJ Symmetric Tree 判断是否为对称树(AC代码)
思路: 主要判断左子树与右子树. 在判断左时,循环下去肯定会到达叶子结点中最左边的结点与最右边的结点比较. 到了这一步因为他们都没有左(右)子树了,所以得开始判断这两个结点的右(左)子树了. 当某 ...
- [leetcode]101. Symmetric Tree对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- [LeetCode OJ] Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- 【LeetCode】Symmetric Tree(对称二叉树)
这道题是LeetCode里的第101道题.是我在学数据结构——二叉树的时候碰见的题. 题目如下: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 ...
- LeetCode 101. Symmetric Tree(镜像树)
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的
题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ...
- Symmetric Tree 对称树
判断一棵二叉树是否为对称的树.如 1 / \ 2 2 / \ / \ 3 4 4 3 观察上面的树可以看出:左子树的右子树等于右子树的左子树,左子树的左子树等于右子树的右子树. 首先可以使用递归.递归 ...
- 【leetcode】Symmetric Tree
Symmetric Tree Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its ...
- Leetcode 101 Symmetric Tree 二叉树
判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...
随机推荐
- 关于android编程中service和activity的区别
一. 绝大部分情况下,Service的作用是用来“执行”后台的.耗时的.重要的任务,三者缺一不可,而最重要的原因是第三点:要执行重要的任务. 因为当一个进程启动了Service后,进程的优先级变高了, ...
- Ubuntu Server 16.04安装xfce4图形界面远程控制
1.首先连接上你的服务器,然后安装vncserver,命令如下 apt-get install vnc4server 2.安装图形界面 apt-get install xfce4如果安装不上,就 ap ...
- 001-OSI七层模型,TCP/IP五层模型
一.概述 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型. OSI/ ...
- Python2 socket 多线程并发 ThreadingTCPServer Demo
# -*- coding:utf-8 -*- from SocketServer import TCPServer, StreamRequestHandler import traceback cla ...
- dockfile
dockerfile是对镜像的描述 新建一个dockfile文件 docker inspect
- $python正则表达式系列(2)——re模块常用函数
本文主要介绍正则re模块的常用函数. 1. 编译正则 import re p = re.compile(r'ab*') print '[Output]' print type(p) print p p ...
- 多个网络请求成功返回再执行另外任务的思路分析(iOS)
前言 今天我们来讨论一个经常出现的需求场景,也是一个老话题.在开发中我们往往会遇到需要进行多个网络请求,并且需要多个网络请求成功返回后再做其他事的场景.比如同一个界面显示的内容需要用到两个网络接口,而 ...
- Sublime Text3 打开文档乱码
一.安装包管理器使用Ctrl+~快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码 import urllib.request,os; pf = 'Package C ...
- java-jpa-criteriaBuilder使用入门
项目中使用jpa ,第一次见查询起来一脸蒙,这就去查下jpa查询的方式,和概念. jpa 元模型 criteria 查询 CriteriaBuilder 安全查询创建工厂 CriteriaQuery ...
- INSPIRED启示录 读书笔记 - 第27章 合理运用瀑布式开发方法
瀑布式开发方法的基本原则 1.采用阶段式开发:软件开发过程被事先分成固定的几个阶段,撰写书面的需求说明文档.设计高层软件架构.设计低层细节.编写代码.测试.部署 2.采用阶段式评审:每个阶段结束后,对 ...