题目描述及链接
题解
注意翻转是要求把结点翻转,而不是把结点的值翻转。
思想:观察可发现,只要把每个子树的左右孩子交换位置,就可以实现将整棵树翻转。
空树(空子树)不需要翻转,直接return。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//翻转是把节点翻转,而不是把节点的值翻转
struct TreeNode* invertTree(struct TreeNode* root){
//思路:从根节点开始依次交换每个子树根节点左右孩子的位置,就可以实现翻转
if(root != NULL)//为空就直接return了
{
//先翻转根节点的孩子
struct TreeNode* tmp = root->left;
root->left = root->right;
root->right = tmp;
//再翻转左右子树,先翻哪边都一样
invertTree(root->left);
invertTree(root->right);
}
return root;
}
总结
本题是从根结点开始往下翻转的。
核心是要主要到交换每个子树的左右孩子的位置就可以实现整棵树的翻转。
递归的出是遇到空子树。
需要注意的是,这里返回值也是逐层返回的。最后返回给调用者的就是翻转后二叉树的根节点。
返回值在这个函数其实不是必须的,可以写成void类型。