leetcode(数据结构)—— 镜像二叉树
镜像二叉树,力扣上面的的题目,这道题很简单,放出来的原因是它要求用两种解法来写这道题——递归和迭代,而且数据结构学到了树,记录自己学习的过程,以免忘了,没地方找。
题目的意图很明显,就是然你写个程序看看是不是对称的,对称的条件很明显:
//左子树点值等于右子树的值
LeftChild->val == RightChild->val
然后我们想一想什么样的树被称为镜像对称?
是不是当一个树的左子树与右子树镜像对称,那么这个树是对称的。那么问题是不是可以转化成:两个树在什么情况下互为镜像?
很明显
当子树相互对称应该符合一下条件:
1、它们的两个根结点具有相同的值。
2、每个树的右子树都与另一个树的左子树镜像对称。
//力扣给的结构体
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
;现在让我来想想递归如何实现
1、递归就会有终止条件,那么这个函数什么时候表示递归结束呢?
当然是到达树的这一分支的最大深度。那么如何检测递归到了树的这一分支的最大深度,很显然每一棵二叉树,如果它不是根节点,那么,当该节点的左右子树都为空时,表示这树的这一支就兜底了。
由于这是镜像二叉树的题而不是测深度,所以我们返回的条件有三种:
第一种,两个节点都为空,返回 true;
第二种,两个节点不都为空 ,返回 false;
第三种,两个节点的值不相等,返回 false;
得出了终止条件递归就基本成型了,就剩下迭代了,迭代这个较为简单,不在这里赘述了。
贴代码:
bool CheckVal(struct TreeNode* LeftChild, struct TreeNode* RightChild)
{
if (NULL == LeftChild && NULL == RightChild)
{
return true;
}
if (NULL == LeftChild || NULL == RightChild)
{
return false;
}
return (LeftChild->val == RightChild->val) && CheckVal(LeftChild->left, RightChild->right) && CheckVal(LeftChild->right, RightChild->left);
} bool isSymmetric(struct TreeNode* root){
if (NULL == root)
{
return true;
}
return CheckVal(root->left, root->right);
}
迭代就不做细说了,这个实现起来太简单了,BFS略微改改就行了
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#define MAXSIZE 1024 bool isSymmetric(struct TreeNode* root){
struct TreeNode *Queue[MAXSIZE];
int index = ;
Queue[index++] = root;
Queue[index++] = root; while ( != index)
{
struct TreeNode *leftChild = Queue[--index];
struct TreeNode *rightChild = Queue[--index]; if (NULL == leftChild && NULL == rightChild)
{
continue;
}
if ((NULL == leftChild || NULL == rightChild) || (leftChild->val != rightChild->val))
{
return false;
} Queue[index++] = leftChild->left;
Queue[index++] = rightChild->right;
Queue[index++] = leftChild->right;
Queue[index++] = rightChild->left;
}
return true;
}
好吧,我这个更像栈一点。
算法不易,诸君共勉!
leetcode(数据结构)—— 镜像二叉树的更多相关文章
- [PHP] 算法-镜像二叉树的PHP实现
操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 思 ...
- LeetCode:翻转二叉树【226】
LeetCode:翻转二叉树[226] 题目描述 翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 题目 ...
- Leetcode题目102.二叉树的层次遍历(队列-中等)
题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...
- python数据结构之二叉树的统计与转换实例
python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...
- 【Leetcode】104. 二叉树的最大深度
题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7 ...
- LeetCode 101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For ex ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- php数据结构之二叉树
树是一种比较重要的数据结构, 尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之 分,其次序不能任意颠倒. ...
- 101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
给定一个二叉树,检查它是否是它自己的镜像(即,围绕它的中心对称).例如,这个二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \3 4 4 3但是 ...
随机推荐
- 关于Android file.createNewFile() 方法出现的问题总结(转)
原文:http://blog.csdn.net/wjdarwin/article/details/7108606 今天在编写向SDcard中,创建文件夹并向其中保存文件的过程中出现个一系列的问题 在此 ...
- ClientAbortException: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。,进不了Debug,访问不到方法
开发项目的时候运行报错,Debug进不去方法,猜想是js中ajax的url 路径的问题,后来找公司的斌哥解决了问题,感谢! 异常: 解决过程: 清理缓存,修改js代码,通过浏览器的F12查看,发现修改 ...
- 洗牌函数[打乱数组的顺序] slice()的新运用 [原来arr.slice(start, end) 的start不是必需的]
function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } functio ...
- <audio>音频标签
<audio ref="audio" @canplay="ready" @error="error" @timeupdate=&qu ...
- 人物 - Larry Elison
甲骨文公司创始人 甲骨文公司首席執行官 狂人,偏执狂 曾说:"Winning is not enough. All others must lose" Only the paran ...
- pygame学习的第一天
pygame最小开发框架: import pygame, sys pygame.init() screen = pygame.display.set_mode((600, 480)) pygame.d ...
- pwn之偏移量offset
0x7fffffffdd00: 0x4141414141414141 0x4141414141414141 0x7fffffffdd10: 0x4141414141414141 0x414141414 ...
- LinkedList学习:API调用、栈、队列实现
参考的博客 Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例 如果你想详细的区了解容器知识以及本文讲的LinkedList,我推荐你去看这篇博客和这个做个的容器系列 Lin ...
- 配置<welcome-file>直接访问请求
方法一.配置welcome-file-list和servlet-mapping <!-- 将默认欢迎页配置为要访问的controller路径 --><welcome-file-lis ...
- list中会直接绑定HashMap中的数据
import java.util.ArrayList;import java.util.HashMap;import java.util.List; public class HashMapSync ...