判断是否是对称二叉树

输入一个二叉树的根节点,判断该二叉树是否是对称的。

测试用例:

功能测试:结构对称值不对称的二叉树,值对称结构不对称的二叉树

特殊值测试:空指针,所有节点值都相等的二叉树,一个节点的二叉树

#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);
}

上面的代码想法是先找到这棵树的镜像,再将这棵树和他的镜像对比,如果两者等同,那么这棵二叉树是对称的。

还有一种想法,是在先序遍历的基础上,调整左孩子和右孩子的访问顺序,先访问一直访问右孩子到叶节点再访问左孩子,形成另类的“右边先序遍历”,同时进行先序遍历和“右边先序遍历”,直到两者在根节点相遇之前都是相等的,那么这个二叉树就是对称的。

猜你喜欢

转载自blog.csdn.net/qq_36162275/article/details/87894033