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

原创 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






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【数据结构】二叉树的翻转递归与非递归实现

二叉树的翻转也是递归的过程,左子树转到右子树,右子树转到左子树。假设有这样的一棵二叉树: 它翻转后应该是这样子的: 代码实现: package 二叉树.翻转; import java.uti...
  • e_one
  • e_one
  • 2016-04-05 14:26
  • 5559

反转二叉树----java实现

实现二叉树的反转 示例: 原二叉树: 4 / \ 2 7 / \ / \ 1 3 6 9 反转后的二叉树: 4 / \ 7 ...

java 反转二叉树算法

题目:Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9to 4 / \ 7 2 ...

[Java]Invert Binary Tree翻转二叉树

leetcode 原题链接:https://leetcode.com/problems/invert-binary-tree/ Invert a binary tree. 4 ...

反转二叉树

反转二叉树,因为Max Howell(Homebrew,mac版的apt-get作者 )出名: Google: 90% of our engineers use the software you w...

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

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

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

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

翻转二叉树(C++)

用递归的方法翻转二叉树

编写复制一颗二叉树的非递归算法

问题描述:设栈的类型为seqstack,initstack(s)为对栈s初始化。 基本思路:用两个栈保存左右树访问的节点,每次访问根后PUSH一下,然后pop出继续保存左右子树。 //...

算法_二叉树反转

前一阵homebrew作者面试谷歌被拒,原因之一是这位老兄无法反转出二叉树。 既然众公司面试都爱用这货面试,咱也来做一下。 先定义二叉树类 public class BinaryTreeNode...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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