博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode:Symmetric Tree
阅读量:5797 次
发布时间:2019-06-18

本文共 3067 字,大约阅读时间需要 10 分钟。

一、     题目

     给一个二叉树,推断这个树是不是镜像的(对称的)。

样例:     1   

         / \

       2   2

      / \   / \

    3   4 4  3

  可是这个就不是:     1

                                 / \

                               2   2

                               \     \

                               3     3

二、     分析

1、递归

     从根開始,迭代查看左子树和右子树是否是对称的。

    当中左子树和右子树对称的条件(均非空条件下)是:

   1>两个节点值相等

   2>左节点的左子树和右节点的右子树对称

   3>左节点的右子树和右节点的左子树对称

2、非递归

    使用非递归时,我们能够创建两个队列,将根节点的左右子树分别入队,入队的同一时候比較。发现对称位置的节点值不等。则返回false;

   1>  根节点的左右子树入队

   2>  队列出队

   3>  假设值相等,则4,否则返回false

   4>  将当前左节点左子树和当前右节点的右子树入队。假设当中仅仅要有一个为空,则返回false

   5>  将当前右节点左子树和当前左节点的右子树入队。假设当中仅仅要有一个为空,则返回false

   6>  最后,推断两个队列是否同一时候为空,是。则返回true,否则返回false

递归:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:	bool isSymmetric(TreeNode *Lroot,TreeNode *Rroot) {        if(Lroot==NULL)        	return Rroot==NULL;                else {        	if(Rroot==NULL)        		return false;        	if(Lroot->val!=Rroot->val)        		return false;            	if(!isSymmetric(Lroot->right,Rroot->left))        		return false;        	if(!isSymmetric(Lroot->left,Rroot->right))        		return false;        	return true;        }	}    bool isSymmetric(TreeNode *root) {        if(root==NULL) return true;        TreeNode *Rroot;        TreeNode *Lroot;        Rroot = root->right;        Lroot = root->left;		return isSymmetric(Lroot,Rroot);     		    }};

/** * Definition for binary tree * 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) return true;        return compare(root->left, root->right);    }    bool compare(TreeNode *Lroot, TreeNode *Rroot) {        if (Lroot!=NULL && Rroot!=NULL) return true;        if (Lroot!=NULL && Rroot==NULL || Lroot==NULL && Rroot!=NULL) return false;        if (Lroot->val != Rroot->val) return false;        return compare(Lroot->left, Rroot->right) && compare(Lroot->right, Rroot->left);    }};
非递归:

/** * Definition for binary tree * 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;        queue
Lque; queue
Rque; if(root->left) Lque.push(root->left); if(root->right) Rque.push(root->right); while(!Lque.empty()&&!Rque.empty()){ TreeNode *ql = Lque.front(); TreeNode *qr = Rque.front(); Lque.pop(); Rque.pop(); if(ql->val == qr->val){ if(ql->left&&qr->right){ Lque.push(ql->left); Rque.push(qr->right); } else if(ql->left||qr->right) return false; if(qr->left&&ql->right){ Lque.push(qr->left); Rque.push(ql->right); } else if(qr->left||ql->right) return false; } else return false; } if(Lque.empty() && Rque.empty()) return true; else return false; }};

转载地址:http://ioifx.baihongyu.com/

你可能感兴趣的文章
css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题
查看>>
BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)
查看>>
【HDU 1228】A + B
查看>>
CentOS 7搭建SVN服务器
查看>>
Atitit.远程接口 监控与木马 常用的api 标准化v2 q216
查看>>
闭包实现循环事件添加
查看>>
linux创建文件树,孩子兄弟树(或广义表),创建文件树及其訪问
查看>>
Floyd最短路算法
查看>>
【荐】如何正确理解PHP之include,include_once,require,require_once等包含作用域
查看>>
Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
查看>>
CentOS 6.6 FTP install
查看>>
C#------判断btye[]是否为空
查看>>
图解Ajax工作原理
查看>>
oracle导入导出小记
查看>>
聊一聊log4j2配置文件log4j2.xml
查看>>
NeHe OpenGL教程 第七课:光照和键盘
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
Php实现版本比较接口
查看>>
删除设备和驱动器中软件图标
查看>>
Android studio开多个窗口引起的问题
查看>>