leetcode(数据结构)—— 镜像二叉树
时间:2019-10-22
本文章向大家介绍leetcode(数据结构)—— 镜像二叉树,主要包括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 = 0; Queue[index++] = root; Queue[index++] = root; while (0 != 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; }
好吧,我这个更像栈一点。
算法不易,诸君共勉!
原文地址:https://www.cnblogs.com/daker-code/p/11719147.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- css的radial-gradient大详解
- 你想知道的优惠券业务,SkrShop告诉你
- js汇率计算器系统
- 数学--数论--欧拉降幂和广义欧拉降幂(实用好理解)
- JS逐步教你做(自己版本)的视频播放器(我先声明,step我不懂是什么意思,所以没用)
- 【mysql系列】细谈“explain”之理论Part
- 如果用java swing编写一个五子棋(人人对战)
- 【mysql系列】细谈explain执行计划之“谜”
- 洛谷 P1352 没有上司的舞会(树形 DP)
- CF思维联系– CodeForces - 991C Candies(二分)
- 洛谷P1122 最大子树和 树形DP初步
- JAVA_WEB--jsp语法
- 图论--树的直径--DFS+树形DP模板
- js逐步教你实现原生电影院系统
- JAVA_WEB--jsp概述