1 题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
2 思路和方法
定义一种遍历算法,先遍历右子结点再遍历左子结点;如对称先序遍历:根结点->右子结点->左子结点;而先序遍历:根结点->左子结点->右子结点;通过比较二叉树的先序遍历和对称先序遍历的序列是否相同来判断二叉树是否对称。注意:因为二叉树的元素可能全部相同,所以将遍历过程中的nullptr也考虑进来。
3 C++核心代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 issymmetrical(pRoot,pRoot); 16 } 17 18 //比较二叉树的先序遍历序列(根->左->右)和对称先序遍历序列(根->右->左),若相等,则对称 19 bool issymmetrical(TreeNode* pRoot1,TreeNode* pRoot2){ 20 21 if(pRoot1==NULL && pRoot2==NULL) 22 return true; //因为可能存在所有元素相等的情况;遍历序列考虑nullptr 23 24 // 一个空指针,另一个非空指针 25 if(pRoot1==NULL || pRoot2==NULL) 26 return false; 27 28 if(pRoot1->val!=pRoot2->val) 29 return false; 30 31 return issymmetrical(pRoot1->right,pRoot2->left) && issymmetrical(pRoot1->left,pRoot2->right); 32 } 33 };
参考资料
https://blog.csdn.net/zjwreal/article/details/89282964