leetcode:Symmetric Tree
来源:互联网 发布:数据库密码设置 编辑:程序博客网 时间:2024/06/06 02:07
一、 题目
给一个二叉树,判断这个树是不是镜像的(对称的)。
例子: 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<TreeNode *> Lque; queue<TreeNode *> 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; }};
0 0
- Leetcode - Tree - Symmetric Tree
- Leetcode - Tree - Symmetric Tree
- LeetCode[Tree]: Symmetric Tree
- [leetcode][tree] Symmetric Tree
- LeetCode: Symmetric Tree
- [Leetcode] Symmetric Tree
- LeetCode : Symmetric Tree
- leetcode 13:symmetric tree
- [LeetCode] Symmetric Tree - Recursively
- [LeetCode] Symmetric Tree - Iteratively
- [LeetCode] Symmetric Tree
- [LeetCode]Symmetric Tree
- Leetcode:Symmetric Tree
- [Leetcode]Symmetric Tree
- Leetcode: Symmetric Tree
- [leetcode]Symmetric Tree
- LeetCode-Symmetric Tree
- [leetcode] Symmetric Tree
- 使用DBMS_JOB来调度作业
- Socket/TCP粘包、多包和少包, 断包
- 一种运行时间为O(nlgn)的基于半分查找法的插入排序算法及C++实现
- 关于在命令行中插入MySql数据时的乱码问题
- poj1290
- leetcode:Symmetric Tree
- 强大的ASP.NET控件---验证控件
- Android代码混淆
- OAF开发概念和案例总结(项目总结)
- 国外著名java技术资料网站
- java数据结构 HashTable链地址法
- 第三章 栈和队列 思维导图
- 机房收费系统文档总结
- Android数据库操作流程和代码