226. 翻转二叉树

地址:

力扣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),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/invert-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

我们观察翻转效果,可以得知,左右节点交换

如果深度 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;
}

代码先交换左右节点,再递归左右子节点,效果一样

查看更多刷题笔记

你可能感兴趣的:(算法训练(C语言版本),leetcode)