你能在白板上写出如何反转一棵二叉树吗?

栏目: IT技术 · 发布时间: 3年前

内容简介:技术招聘已经变味了:Homebrew 作者 Max Howell 面试谷歌被拒为例。谷歌说他们有 90% 的员工使用了 Max 开发的 Homebrew,但因为在面试时 Max 没能在白板上写出如何反转一颗二叉树而被拒。

技术招聘已经变味了:Homebrew 作者 Max Howell 面试谷歌被拒为例。谷歌说他们有 90% 的员工使用了 Max 开发的 Homebrew,但因为在面试时 Max 没能在白板上写出如何反转一颗二叉树而被拒。

题目描述

你能在白板上写出如何反转一棵二叉树吗?

题解

其实就是交换一下左右节点,然后再递归的交换左节点,右节点

根据动画图我们可以总结出递归的两个条件如下:

终止条件:当前节点为null时返回

交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点

时间复杂度:每个元素都必须访问一次,所以是O(n)

空间复杂度:最坏的情况下,需要存放O(h)个函数调用(h是树的高度),所以是O(h)

代码实现如下:

package i

/**
 * @author: Jack
 * 2020-05-08 13:41
 *

面试题27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

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

镜像输出:

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

 

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

 */

fun mirrorTree(root: TreeNode?): TreeNode? {
    if (null == root) return null

    mirrorNode(root)

    mirrorTree(root.left)
    mirrorTree(root.right)

    return root
}

private fun mirrorNode(root: TreeNode) {
    val right = root.right
    root.right = root.left
    root.left = right
}


class TreeNode(var n: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null

    override fun toString(): String {
        return "TreeNode(n=$n, left=$left, right=$right)"
    }
}

fun main() {
    val root = TreeNode(4)

    val left = TreeNode(2)
    root.left = left
    left.left = TreeNode(1)
    left.right = TreeNode(3)

    val right = TreeNode(7)
    root.right = right
    right.left = TreeNode(6)
    right.right = TreeNode(9)

    println(root)

    mirrorTree(root)

    println(root)

}

运行输出:

TreeNode(n=4, left=TreeNode(n=2, left=TreeNode(n=1, left=null, right=null), right=TreeNode(n=3, left=null, right=null)), right=TreeNode(n=7, left=TreeNode(n=6, left=null, right=null), right=TreeNode(n=9, left=null, right=null)))
TreeNode(n=4, left=TreeNode(n=7, left=TreeNode(n=9, left=null, right=null), right=TreeNode(n=6, left=null, right=null)), right=TreeNode(n=2, left=TreeNode(n=3, left=null, right=null), right=TreeNode(n=1, left=null, right=null)))

OK,也许你写出来了反转二叉树的代码,但是你就是写不出来homebrew,这个世界太扯淡了……

Kotlin开发者社区

你能在白板上写出如何反转一棵二叉树吗?

专注分享 Java 、 Kotlin、Spring/Spring Boot、 MySQLredis 、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、"高可用,高性能,高实时"大型分布式系统架构设计主题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法分析

数据结构与算法分析

韦斯(Mark Allen Weiss) / 机械工业出版社 / 2010-8 / 45.00元

《数据结构与算法分析:C语言描述》曾被评为20世纪顶尖的30部计算机著作之一,作者在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到广泛好评,已被世界500余所大学选作教材。 在《数据结构与算法分析:C语言描述》中,作者精炼并强化了他对算法和数据结构方面创新的处理方法。通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析。 ......一起来看看 《数据结构与算法分析》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码