输入一个二叉树的根节点,判断该二叉树是否是对称的。
测试用例:
功能测试:结构对称值不对称的二叉树,值对称结构不对称的二叉树
特殊值测试:空指针,所有节点值都相等的二叉树,一个节点的二叉树
#include<iostream>
#include<string.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* Lnode;
TreeNode* Rnode;
TreeNode(int i=0)
{
val=i;
Lnode=nullptr;
Rnode=nullptr;
}
};
TreeNode* MirrorTree(TreeNode* root)
{
if(root==nullptr)
return nullptr;
TreeNode* tmp=root->Lnode;
root->Lnode=root->Rnode;
root->Rnode=tmp;
MirrorTree(root->Lnode);
MirrorTree(root->Rnode);
return root;
}
bool DoesTreeEqual(TreeNode* root1,TreeNode* root2)
{
if(root1==nullptr&&root2==nullptr)
return true;
if(root1==nullptr||root2==nullptr)
return false;
if(root1->val!=root2->val)
return false;
if(root1->val==root2->val)
return DoesTreeEqual(root1->Lnode,root1->Lnode)&&DoesTreeEqual(root1->Rnode,root2->Rnode);
}
bool DoesTreeSymmetrical(TreeNode* root)
{
if(root==nullptr)
return false;
TreeNode* mirrorroot=MirrorTree(root);
return DoesTreeEqual(root,mirrorroot);
}
上面的代码想法是先找到这棵树的镜像,再将这棵树和他的镜像对比,如果两者等同,那么这棵二叉树是对称的。
还有一种想法,是在先序遍历的基础上,调整左孩子和右孩子的访问顺序,先访问一直访问右孩子到叶节点再访问左孩子,形成另类的“右边先序遍历”,同时进行先序遍历和“右边先序遍历”,直到两者在根节点相遇之前都是相等的,那么这个二叉树就是对称的。