目录
1.翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
思路:
依次交换根节点的左右子树即可。
图解:
如下图,圈中的部分为每次需要交换的部分,经过多次交换后,就翻转了二叉树。
代码:
void Swap(struct TreeNode** root1,struct TreeNode** root2){//交互
struct TreeNode* temp=*root1;
*root1=*root2;
*root2=temp;
}
struct TreeNode* invertTree(struct TreeNode* root){
if(root==NULL){
return NULL;
}
Swap(&root->left,&root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
交换一次完成后,递归交换其他部分。
注意:交换的左右子树分别由left和right指向的,那么此时需要改变指针的指向需要二级指针。
2.给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
代码:
bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2){
if(root1==NULL&&root2==NULL){
return true;
}
if((root1==NULL||root2==NULL)||root1->val!=root2->val){
return false;
}
return _isSymmetric(root1->left,root2->right)&&_isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL){
return true;
}
return _isSymmetric(root->left,root->right);
}
代码逻辑:除去根节点后,依次检查其左右子树是否是对称的。一旦左子树的值不等于有子树的值或者左右子树其中一个为空,那么这个树一定不是对称的,返回false。只要左右子树同时为空,说明左右子树同时走到NULL,此时返回true。