地址:
力扣https://leetcode-cn.com/problems/invert-binary-tree/
题目:
翻转一棵二叉树。
示例:
输入:
4 / \ 2 7 / \ / \ 1 3 6 9 |
输出:
4 / \ 7 2 / \ / \ 9 6 3 1 |
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
思路:
我们观察翻转效果,可以得知,左右节点交换
如果深度 2 的树,直接交换即可
如果深度 > 2 的树,就没有办法直接交换了,变成了兄弟之间交换,隔太远
那么要达成这样的效果,可以先将当前根节点下的左右子节点交换,比如:
4 / \ 2 7 / \ / \ 1 3 6 9 |
假设当前根节点为 2,交换其下面的子节点
4 / \ 2 7 / \ / \ 3 1 6 9 |
对于 根节点 4 来讲,其左子树 全部交换完成,换右子树,同理
4 / \ 2 7 / \ / \ 3 1 9 6 |
左右递归都交换完成后,再交换本层的左右
4 / \ 7 2 / \ / \ 9 6 3 1 |
方法一、递归交换左右子节点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void doinvertTree(struct TreeNode* root){
struct TreeNode *node;
if(root == NULL)
return;
node = root->left;
root->left = root->right;
root->right = node;
doinvertTree(root->left);
doinvertTree(root->right);
}
struct TreeNode* invertTree(struct TreeNode* root){
doinvertTree(root);
return root;
}
代码先交换左右节点,再递归左右子节点,效果一样
查看更多刷题笔记