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

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






相关文章推荐

二叉查找树的镜像

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于 右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / \ 6 10 /\ ...

输入一颗二元查找树,将该树转换为它的镜像

微软面试题,难度系数中下,题目描述如下: 题目:输入一颗二元查找树,将该树转换为它的镜像,  即在转换后的二元查找树中,左子树的结点都大于右子树的结点。  用递归和循环两种方法完成树的镜像转换。  例...

求二叉树的镜像

输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 分析: (1)递归的思想很简单:如果左子树和右子树都已经...
  • bnufq
  • bnufq
  • 2012年12月30日 10:39
  • 2366

Leetcode 226: Invert Binary Tree(二叉树反转 递归、非递归实现)

nvert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 ...

树、森林与二叉树相互转化原理图

1、树转换为二叉树 由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。 将树转换成二叉树的步骤是: (1)加线。就是在所有兄弟结点之间加一条...

翻转二叉树 - C++

class Solution { public: /** * @param root: a TreeNode, the root of the binary tree * ...

翻转二叉树(C++)

用递归的方法翻转二叉树

C++二叉树翻转

#include using namespace std;template struct Node { Type data; Node *left; Node *right;...

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

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

使用栈来实现二叉树的反转(invert)

最近在刷leetcode,碰到这样一道题这题并不难,如果用递归的话半分钟就能搞定。不过感觉递归效率比较低,因为递归可以用栈来实现,于是琢磨能不能用栈来搞定。 这是用递归的解法:// 递归算法 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图算法之如何反转一颗二叉树
举报原因:
原因补充:

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