题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
镜像二叉树,意思是:
1、根节点的左、右节点交换位置,
2、子节点的左右节点重复1
所以一棵二叉树的镜像如下:
、如题所述,要满足镜像重复,二叉树形状应该类似如下结构:
根节点下:左右子树安装 先序遍历和后序遍历结构相同,且值相同则为重复
#pragma once
namespace symmetry_tree
{
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(nullptr), right(nullptr) {
}
};
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if (pRoot == nullptr) return true;
return child_for(pRoot->left, pRoot->right);
}
bool child_for(TreeNode* pLeft, TreeNode *pRight)
{
bool left = false;
bool right = false;
if (pLeft == nullptr)
{
left = true;
}
if (pRight == nullptr)
{
right = true;
}
if (left != right)
{
return false;
}
if (left == true)
{
return true;
}
bool r = child_for(pLeft->left, pRight->right);
if (r == false)
{
return r;
}
if (pLeft->val != pRight->val)
{
return false;
}
r = child_for(pLeft->right, pRight->left);
return r;
}
};
}
test.cpp
#pragma once
#include "symmetry_tree.h"
namespace symmetry_tree
{
void start_test()
{
Solution s;
TreeNode* n1 = new TreeNode(1);
TreeNode* n2 = new TreeNode(2);
TreeNode* n3 = new TreeNode(3);
TreeNode* n4 = new TreeNode(4);
TreeNode* n5 = new TreeNode(5);
TreeNode* n6 = new TreeNode(6);
TreeNode* n7 = new TreeNode(7);
TreeNode* n8 = new TreeNode(8);
TreeNode* n9 = new TreeNode(9);
n1->left = n2;
n1->right = n3;
n2->left = n5;
n2->right = n6;
n3->left = n7;
n3->right = n8;
//n7->left = n9;
bool r = s.isSymmetrical(n1);
}
}