返回

用递归和分治思维重新理解 LeetCode 226. 翻转二叉树,让编程不再困难

前端

理解问题:

LeetCode 226. 翻转二叉树问题如下:

给定一个二叉树,你需要将它的左右子树交换。

例如:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

翻转后:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

算法思路:

我们可以使用递归和分治的思想来解决这个问题。具体步骤如下:

  1. 如果当前节点为空,则直接返回。
  2. 交换当前节点的左右子树。
  3. 递归地翻转左子树。
  4. 递归地翻转右子树。

代码实现:

def invert_tree(root):
    if not root:
        return

    # 交换左右子树
    root.left, root.right = root.right, root.left

    # 递归地翻转左子树
    invert_tree(root.left)

    # 递归地翻转右子树
    invert_tree(root.right)

    return root
public TreeNode invertTree(TreeNode root) {
    if (root == null) {
        return null;
    }

    // 交换左右子树
    TreeNode tmp = root.left;
    root.left = root.right;
    root.right = tmp;

    // 递归地翻转左子树
    invertTree(root.left);

    // 递归地翻转右子树
    invertTree(root.right);

    return root;
}
TreeNode* invertTree(TreeNode* root) {
    if (root == nullptr) {
        return nullptr;
    }

    // 交换左右子树
    std::swap(root->left, root->right);

    // 递归地翻转左子树
    invertTree(root->left);

    // 递归地翻转右子树
    invertTree(root->right);

    return root;
}

总结:

使用递归和分治的思维来解决 LeetCode 226. 翻转二叉树问题,可以帮助我们更好地理解算法的思想和实现方式。同时,我们也提供了详细的Python、Java和C++实现代码,供您参考和使用。希望这篇文章能够帮助您轻松掌握这一算法技巧,并在编程实践中灵活运用。