博客
关于我
226. Invert Binary Tree
阅读量:798 次
发布时间:2023-04-16

本文共 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)。

    转载地址:http://ejgfk.baihongyu.com/

    你可能感兴趣的文章
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    OpenCV探索
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>
    opencv面向对象设计初探
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    OpenDaylight融合OpenStack架构分析
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    OpenFeign源码学习
    查看>>
    OpenFeign组件声明式服务调用
    查看>>
    OpenGL中shader读取实现
    查看>>
    OpenGL着色器、纹理开发案例
    查看>>