美人为了不被恶魔吃掉,就给他讲了一个又一个的故事,一直讲了一千零一夜,后来魔鬼终于困了。姑娘 用发丝勒死了魔鬼。然后姑娘发现,每到晚上,自己的手就会长出鳞片,白天又会消失。
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1 / \ 2 2 \ \ 3 3
BONUS:
在C++中点和箭头的区别,之前写过,现在再复习下
In one word:
指针就用箭头,不然就是点
不同点:点运算符( . )的左边操作数是一个结果为结构的表达式;
箭头运算符( -> )的左边的操作数是一个指向结构体的指针。
例如:
typedef struct // 定义一个结构体类型:DATA
{
char key[10]; // 结构体成员:key
char name[20]; // 结构体成员:name
int age; // 结构体成员:age
}DATA;
DATA data; // 声明一个结构体变量
DATA *pdata; // 声明一个指向结构体的指针
// 访问数据操作如下:
data.age = 24; // 结构体变量通过点运算符( . )访问
pdata->age = 24; // 指向结构体的指针通过箭头运算符( -> )访问
解法主要是主函数很难写:
首先,类里的函数输入是指针,所以必须有一个指向树的指针
但是树在构建过程中不是指针所以左右子树赋值方式在不停变换
另外结构体自身有初始化方式,要用结构体自定义的方式赋值才能建树
#include <iostream> #include<vector> #include<string> #include<iterator> # include<cstdlib> using namespace std; /** Definition for a binary tree node. */ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: bool isSymmetric(TreeNode* root) { return isMirror(root,root); } bool isMirror(TreeNode* root1,TreeNode* root2){ if(!root1&&!root2) return true; if(!root1||!root2) return false; return root1->val==root2->val&&isMirror(root1->left,root2->right)&&isMirror(root1->right,root2->left); } }; int main() { Solution s1; TreeNode T1(1); TreeNode T2(2); //T2->val=2; TreeNode T3(2); //T3->val=2; TreeNode T4(3); //T4->val=3; TreeNode T5(4); //T5->val=4; TreeNode T6(4); //T6->val=4; TreeNode T7(3); //T7->val=3; TreeNode* root=&T1; root->left=&T2; root->right=&T3; T2.left=&T4; T2.right=&T5; T3.left=&T6; T3.right=&T7; cout<<s1.isSymmetric(root)<<endl; }