C++ 判断一棵二叉树是否对称
2014-07-01 12:01
316 查看
一棵二叉树对称,就是说它如果以根为轴,翻转过去一样,如下图所示,以虚线为轴,把左边翻转到右边,各顶点及顶点中的值一一对应。
注意,它并不要求单独看子树的时候子树也是对称的,如下图,单独看左子树时,左子树是不对称的,单独看右子树时,右子树也是不对称的,但这棵本身是对称的。
要判断一棵二叉树是否对称,那就是判断它的左子树翻转过去是否和右子树一样,注意这里的“一样”包括了值也一样。
下面给出代码,其中的例子中的树,就是第一张图中的那棵树:
下面通过几个简单的图来说明一下。
mySymmetric(leftChild->left,rightChild->right)是计算下图中蓝色方框的部分是否关于对称轴对称:
mySymmetric(leftChild->right,rightChild->left)是计算下图中蓝色方框的部分是否关于对称轴对称:
别忘了还要比较它们的值是否相等~
注意,它并不要求单独看子树的时候子树也是对称的,如下图,单独看左子树时,左子树是不对称的,单独看右子树时,右子树也是不对称的,但这棵本身是对称的。
要判断一棵二叉树是否对称,那就是判断它的左子树翻转过去是否和右子树一样,注意这里的“一样”包括了值也一样。
下面给出代码,其中的例子中的树,就是第一张图中的那棵树:
#include <iostream> using namespace std; 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; return mySymmetric(root->left,root->right);//否则判断以root为根时,左子树翻转后是否和右子树一样 } bool mySymmetric(TreeNode *leftChild,TreeNode *rightChild) { if(leftChild==NULL && rightChild==NULL)//左右子树都为空,对称 return true; else if(leftChild!=NULL && rightChild==NULL || leftChild==NULL && rightChild!=NULL){//一个空一个非空,则不对称 return false; }else{ //否则,再判断 if(mySymmetric(leftChild->left,rightChild->right) //(1)leftChild的左子树和rightChild的右子树对称吗? && mySymmetric(leftChild->right,rightChild->left) //(2)leftChild的右子树和rightChild的左子树对称吗? && leftChild->val==rightChild->val){ //(3)leftChild和rightChild的值一样吗? return true;//三个条件都满足,对称 }else return false;//否则不对称 } } }; int main() { //例子 TreeNode root(1); TreeNode leftChild(2); TreeNode rightChild(2); TreeNode leftLeftChild(3); TreeNode leftRightChild(4); TreeNode rightLeftChild(4); TreeNode rightRightChild(3); root.left=&leftChild; root.right=&rightChild; leftChild.left=&leftLeftChild; leftChild.right=&leftRightChild; rightChild.left=&rightLeftChild; rightChild.right=&rightRightChild; Solution s; if(true==s.isSymmetric(&root)) cout<<"对称"<<endl; else cout<<"不对称"<<endl; system("pause"); return 0; }
下面通过几个简单的图来说明一下。
mySymmetric(leftChild->left,rightChild->right)是计算下图中蓝色方框的部分是否关于对称轴对称:
mySymmetric(leftChild->right,rightChild->left)是计算下图中蓝色方框的部分是否关于对称轴对称:
别忘了还要比较它们的值是否相等~
相关文章推荐
- [互联网面试笔试汇总C/C++-14] 判断一棵二叉树是否是二叉搜索树-微策略
- [互联网面试笔试汇总C/C++-15] 判断一棵二叉树是否是完全搜索树-微策略
- Java代码 判断一棵二叉树是否为对称的
- leetcode_101. Symmetric Tree 对称树, 判断一棵二叉树是否对称,递归方法
- 判断一棵二叉树是否为对称的 java
- 【二叉树】判断一棵二叉树是否是平衡二叉树/求一棵二叉树的镜像/对称的二叉树
- 判断一棵二叉树是否是对称的
- [互联网面试笔试汇总C/C++-16] 判断一棵二叉树是否是平衡二叉树
- 剑指Offer 面试题28:判断一棵二叉树是否镜对称 Java代码实现
- C++ 推断一棵二叉树是否对称
- java、python语言判断一棵二叉树是否对称
- 判断二叉树是否是水平对称的 Symmetric Tree
- 判断二叉树是否对称
- 判断一棵二叉树是否为完全二叉树
- 判断一棵二叉树是否为AVL树
- 数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)
- 通过队列实现判断一棵二叉树是否为完全二叉树
- C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同
- 判断一棵二叉树是否是完全二叉树
- [LeetCode] Symmetric Tree 判断二叉树是否为对称二叉树