226. Invert Binary Tree
发布日期:2025-06-19 14:38:53 浏览次数:3 分类:精选文章

本文共 1648 字,大约阅读时间需要 5 分钟。

反转二叉树

你是否遇到过在白板上无法用手比划出二叉树反转的难题?这则来自Google的趣味故事似乎印证了这件事。那么,如何在代码中实现二叉树的反转呢?我们一起来探讨一下这个问题。

给定以下二叉树结构:

4/

2 7/ \ /
1 3 6 9

目标是将其反转为:

4/

7 2/ \ /
9 6 3 1

这个问题看起来像是一种二叉树的镜像反转,但实际上涉及到交换子节点的位置。我们可以通过使用栈来实现这一点,因为栈非常适合处理后序遍历。

算法思路:

  • 使用栈来跟踪节点的处理过程。
  • 每次从栈顶取出一个节点,检查其左右子节点的状态:
    • 如果左子节点和右子节点都为空,继续处理下一个节点。
    • 如果右子节点为空,则将左子节点赋值给右子节点,并将左子节点置为空,再将左子节点重新压入栈。
    • 如果左子节点为空,则将右子节点赋值给左子节点,并将右子节点置为空,再将右子节点重新压入栈。
    • 如果左右子节点都不为空,则交换左右子节点的位置,再将左子节点和右子节点重新压入栈。
  • 这种方法通过不断交换左右子节点的位置,最终实现了二叉树的反转。

    代码实现:

    public class Solution {    public TreeNode invertTree(TreeNode root) {        if (root == null) {            return null;        }        Stack stack = new Stack();        stack.push(root);        TreeNode tmp, left;        while (!stack.empty()) {            tmp = stack.pop();            if (tmp.left == null && tmp.right == null) {                continue;            }            if (tmp.left == null) {                tmp.left = tmp.right;                tmp.right = null;                stack.push(tmp.left);                continue;            }            if (tmp.right == null) {                tmp.right = tmp.left;                tmp.left = null;                stack.push(tmp.right);                continue;            }            left = tmp.left;            tmp.left = tmp.right;            tmp.right = left;            stack.push(tmp.left);            stack.push(tmp.right);        }        return root;    }}

    代码解释:

  • 检查根节点是否为空,若为空则返回null。
  • 初始化栈,并将根节点压入栈。
  • 使用循环处理栈中的节点:
    • 如果当前节点的左右子节点都为空,继续处理下一个节点。
    • 如果右子节点为空,交换左、右子节点的位置,并将左子节点压入栈。
    • 如果左子节点为空,交换左、右子节点的位置,并将右子节点压入栈。
    • 如果左右子节点都不为空,交换左右子节点的位置,并将左右子节点重新压入栈。
  • 循环结束后,返回处理后的根节点。
  • 通过这种方法,我们可以轻松地实现二叉树的反转。这个算法的时间复杂度为O(h),其中h是树的高度,空间复杂度为O(h)。

    上一篇:23种设计模式概述
    下一篇:222

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2026年06月03日 13时01分15秒