剑指offer-对称的二叉树

 

题目描述

 

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
 

解题思路

 

注意到二叉树的前序遍历是从根节点开始,先遍历左子树再遍历右子树,由此可定义一种遍历顺序:先遍历根节点,再遍历右子树,最后是左子树,不妨称之为右序遍历。若该二叉树是对称的,那么意味着前序遍历的节点顺序与右序遍历应完全相同,包括所有指向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 };

 

posted @ 2018-04-12 10:59  FlyingWarrior  阅读(219)  评论(0编辑  收藏  举报