题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路
注意到二叉树的前序遍历是从根节点开始,先遍历左子树再遍历右子树,由此可定义一种遍历顺序:先遍历根节点,再遍历右子树,最后是左子树,不妨称之为右序遍历。若该二叉树是对称的,那么意味着前序遍历的节点顺序与右序遍历应完全相同,包括所有指向NULL的子节点。因此可从根节点开始,递归的同时用两种顺序遍历二叉树,若遇到两节点都不为空,则判断两节点指向的值是否相同,不相同就返回false,相同的话再次递归向下分别进行遍历;若遇到两节点其中一个为NULL,说明不对称返回false;若遇到两节点都为NULL,返回true。
代码
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 12 public: 13 bool isSymmetrical(TreeNode* pRoot) 14 { 15 return Symm(pRoot,pRoot); 16 } 17 bool Symm(TreeNode* t1,TreeNode* t2){ 18 if(t1&&t2){ 19 if(t1->val!=t2->val) 20 return false; 21 else 22 return Symm(t1->left,t2->right)&&Symm(t1->right,t2->left); 23 } 24 else if((t1&&!t2)||(!t1&&t2)) 25 return false; 26 else 27 return true; 28 } 29 };