镜像二叉树,力扣上面的的题目,这道题很简单,放出来的原因是它要求用两种解法来写这道题——递归和迭代,而且数据结构学到了树,记录自己学习的过程,以免忘了,没地方找。

题目的意图很明显,就是然你写个程序看看是不是对称的,对称的条件很明显:

//左子树点值等于右子树的值
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;
}

  好吧,我这个更像栈一点。

算法不易,诸君共勉!

最新文章

  1. 埃尔米特插值问题——用Python进行数值计算
  2. Golang gzip的压缩和解压
  3. MySQL substring:字符串截取 (转载)
  4. oracle忘记sys/system/scott用户密码了,如何重置oracle密码?
  5. vijos 1006 spfa **
  6. 译文: async/await SynchronizationContext 上下文问题
  7. 【转】Java多线程操作局部变量与全局变量
  8. 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
  9. Django之上传文件
  10. Zip操作的工具类
  11. MySQL_列值为null对索引的影响_实践
  12. CF1119B Alyona and a Narrow Fridge
  13. Spark入门到精通--(第八节)环境搭建(Hadoop搭建)
  14. for循环、while循环、break、continue、exit
  15. sublime使用Package Control不能正常使用的解决办法
  16. 用css绘制图形
  17. springcloud注解@EnableDiscoveryClient与@EnableEurekaC
  18. mybatis中sql标签、where标签、foreach标签用法
  19. GO_01:Mac之Go语言Idea环境配置
  20. 判断一颗二叉树是否为二叉平衡树 python 代码

热门文章

  1. kafka控制测试发送接收消息
  2. 使用 C++ 处理 JSON 数据交换格式
  3. LeetCode刷题--21.合并两个有序链表(简单)
  4. 你知道HTTP协议的ETag是干什么的吗?
  5. 【剑指Offer面试编程题】题目1390:矩形覆盖--九度OJ
  6. markdown基本语法教程
  7. java并发初探ConcurrentHashMap
  8. springboot#配置https
  9. Unity3d fbx纹理不显示 原因
  10. 创建用户(adduser和useradd)和删除用户(userdel)及