二叉树镜像,对称二叉树的判断-symmetric Tree
2016-02-23 22:01
225 查看
leetcode简单题目:Symmetric Tree的问题
一.通过这道题目我们可以复习以下知识点:1.1.二叉树的前序,中序,后序遍历方法
二叉树的前序,中序,后序遍历是解决关于树问题的基础内容,代码很简单如下所示:
这里我将二叉树的值存入到相应的vector当中
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ void preOrder(TreeNode*root,vector<int>&pre) { if(root!=NULL) { pre.push_back(root->val); preOrder(root->left,pre); preOrder(root->right,pre); } } void inOrder(TreeNode*root,vector<int>&in) { if(root!= NULL) { inOrder(root->left,in); in.push_back(root->val); inOrder(root->right,in); } } void postOrder(TreeNode*root,vector<int>&post) { if(root!= NULL) { postOrder(root->left,post); postOrder(root->right,post); post.push_back(root->val); } }
1.2.如何唯一确定一颗二叉树
我们知道唯一的确定一颗二叉树有两种遍历方法:
前序+中序;中序+后序
注意:前序+后序方法无法唯一确定一颗二叉树
1.3.二叉树的镜像
二叉树的镜像的题目有很多博客都有讲到这里我给大家一个link:镜像二叉树的构建
二.两种思路讲解:
2.1.二叉树的唯一确定方法+镜像二叉树的构造
思路阐述:
step one:前序,中序遍历二叉树并将遍历结果保存到相应的vector当中
step two:做二叉树镜像操作,并执行step one
step three:比较相应的vector当中的元素顺序是否一致
代码如下:
//方法一: class Solution { public: bool isSymmetric(TreeNode* root) { vector<int>pre1,pre2,in1,in2; preOrder(root,pre1); inOrder(root,in1); iso(root); preOrder(root,pre2); inOrder(root,in2); for(int i=0;i<pre1.size();i++) { if(pre1[i]!=pre2[i]||in1[i]!=in2[i]) { return false; } } return true; } void preOrder(TreeNode*root,vector<int>&pre) { if(root!=NULL) { pre.push_back(root->val); preOrder(root->left,pre); preOrder(root->right,pre); } } void inOrder(TreeNode*root,vector<int>&in) { if(root!= NULL) { inOrder(root->left,in); in.push_back(root->val); inOrder(root->right,in); } } void iso(TreeNode*root) { if(!root) { return ; } TreeNode*temp=root->left; root->left=root->right; root->right=temp; iso(root->left); iso(root->right); } };
2.2.递归遍历二叉树并进行值得比较
简单思路阐述:
这种方法是一种最为普遍的方法,也有助于我们更好的复习递归操作,主要是自顶向下的顺序进行二叉树判断:二叉树的左子树->左子树与二叉树的右子数->右子树以及二叉树左子树->右子树与二叉树的右子树->左子树的递归比较操作,
代码如下:
//方法二: class Solution { public: bool isSymmetric(TreeNode *root) { if(!root) return true; return isSymmetric(root->left,root->right); } bool isSymmetric(TreeNode *left, TreeNode *right) { if (!left && !right) return true; if (!left || !right) return false; return left->val == right->val && isSymmetric(left->left, right->right)&& isSymmetric(left->right, right->left); } };
三.总结
二叉树的知识是树这一章节的基本知识,并且与二叉树相关的概念很多,因此二叉排序树、线索树,以及和链表关联的题目琳琅满目。所有的题目都来源于生活,出自于基本知识点。希望与大家把所有的知识点活灵活用,解决更多的问题,大家一同努力!
相关文章推荐
- 求二叉树最远距离两个点
- 老男孩27期学员-我的目标
- MYSQL日常
- Tomcat输出catalina.out的大小控制
- 17996 Daily Cool Run
- 【慕课笔记】第四章 JAVA中的集合框架(上) 第9节 学生选课—应用泛型管理课程(一)
- Regular Expressions in Python with re module
- 第50课:HadoopMapReduce倒排索引解析与实战
- Clojure 学习入门(19)—— 数组
- python成长之路第三篇(1)_初识函数
- 北京住房公积金查询
- 最大权闭合图
- 随笔:异类&天才
- event.keyCode|| event.which
- jQuery Mobile 入门
- 页面加载时创建iframe
- 十进制转二进制
- 快速排序
- MATLAB BP神经网络中仿真结果与手工计算不符合的解决办法
- 中国地方方言交流学习总群 QQ群208192582