图算法之如何反转一颗二叉树

原创 2016年05月13日 17:34:48


一个题目难倒一个英雄好汉。这个题目曾让Homebrew的作者失去了一次进入Google工作的机会。在这里,我们不讨论是非,只聊技术!我个人认为,算法和数据结构还是要懂一点的。因为算法和数据结构不仅能解决我们在写程序的时候遇到的性能问题,而且还能扩展我们解决问题的方法。


问题的简单描述:反转一颗二叉树。什么是二叉树呢?二叉树就是每个节点最多有两个子树的树。通常,子树被称为“左子树”和“右子树”。本文的任务就是讲一个节点的左右子树交换位置。


首先,我们来构建一颗二叉树。在本次实践中,我准备使用对象指针的方式来构建一颗二叉树。


  1. 定义二叉树的节点- Node

这个节点,应该包括三个部分:节点的值,左引用,右引用。

节点的值:用来保存该节点的值。

左引用:保存它的左子树的引用。

右引用:保存它的右子树的引用。



这个类非常的简单,就是保存节点的信息。


2. 定义一个树 - Tree

其实树也可以不定义,因为我们只要知道了一棵树的根节点,就能将整棵树都遍历出来(具体的遍历方法再说)。但我为了让程序更加的清晰明了,更贴近主题,就新建一颗树。这棵树只有一个公开属性:root,用来保存树的根节点。并且封装了对树操作的一些方法。


其中invert_tree 是用来反转树的方法。


3. 反转一颗树

我打算使用递归来反转一颗树。在看代码之前,我先说一下我的思路。我们要反转一颗树,其实就是反转树中的每个节点的左右子树。伪代码如下:

a. 获取节点node

  a.1 交换节点node的左右节点

  a.2 反转节点的左子树

  a.3 反转节点的右子树

具体的实现代码如下:


从代码片段可以看出,实现逻辑很简单,就是交换左右节点,然后继续递归。

使用递归的时候,一定要注意:需要终止条件!否则就会进入死循环,从而结果不可预知。


总结

反转一颗树实现还是很简单的,关键是思路。树的构建其实有很多很重要的主题,除了反转树以外,还有减枝等。这些操作对构建一颗平衡二叉树很关键。平衡二叉树是可以实际用来我们的代码中的。


其次使用动态语言写算法有一个优点就是能让我们聚焦在算法的核心思想上,而不要关注太多的实现细节。比如,使用Ruby写快速排序就非常的简单,三行代码就能搞定。具体怎么做,我们可以以后详说。


推荐:

关注我的公众微信号:一个技术人员的胡言乱语    ,一起学习算法,数据结构,机器学习,人工智能等主题~


http://mp.weixin.qq.com/s?__biz=MzAwMDk1MTUyNw==&mid=100000001&idx=1&sn=dc435e0c663929ba1904c10fd07c73e3#rd






[数据结构][Leetcode]翻转二叉树

1.问题描述Invert a binary tree.For example: to Google: 90% of our engineers use the software you wr...
  • u014359097
  • u014359097
  • 2015年12月08日 22:16
  • 1547

反转二叉树

反转二叉树,因为Max Howell(Homebrew,mac版的apt-get作者 )出名: Google: 90% of our engineers use the software you w...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年05月30日 16:01
  • 2606

【LeetCode-面试算法经典-Java实现】【226-Invert Binary Tree(反转二叉树)】

【226-Invert Binary Tree(反转二叉树)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-Ch...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月30日 06:24
  • 4022

翻转二叉树(递归与非递归)

翻转一棵二叉树样例 1 1 / \ / \ 2 3 => 3 2 / \ 4 4 递归版本先翻转左子树,后翻转右子树,然...
  • zwhlxl
  • zwhlxl
  • 2015年08月12日 06:47
  • 2952

反转二叉树,哈哈

这个问题因为前段时间一个大牛工程师Max Howell面试谷歌都火了,后来这家伙去了苹果。。我也不知道说什么了,谷姑娘把人家活生生的给拒了。 我今天也试着写了一下,递归版本的很easy的就写了出来。...
  • u013220338
  • u013220338
  • 2015年10月09日 14:25
  • 1009

反转二叉树

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode...
  • u012703795
  • u012703795
  • 2016年05月30日 21:46
  • 852

翻转二叉树(C++)

用递归的方法翻转二叉树
  • light_bo
  • light_bo
  • 2015年06月25日 21:39
  • 2273

反转二叉树(二叉树的镜像)

输入一个二叉树,输出其镜像。     如下图,即交换所有节点的左右子树。     这里提供两种思路:使用递归和不使用递归。     使用的二叉树定义如下: public class Tree...
  • yiyiwudian
  • yiyiwudian
  • 2015年06月15日 22:05
  • 5153

lintcode 翻转二叉树

1:问题描述  翻转一棵二叉树 样例 1 1 / \ / \ 2 3 => 3 2 / \ 4 4 2:解题思路...
  • wangyukl
  • wangyukl
  • 2017年04月13日 16:59
  • 501

翻转二叉树

翻转一棵二叉树 您在真实的面试中是否遇到过这个题?  Yes 样例 1 1 / \ / \ 2 3 => 3 2 ...
  • wwe4023
  • wwe4023
  • 2017年06月23日 16:29
  • 102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图算法之如何反转一颗二叉树
举报原因:
原因补充:

(最多只允许输入30个字)