一个题目难倒一个英雄好汉。这个题目曾让Homebrew的作者失去了一次进入Google工作的机会。在这里,我们不讨论是非,只聊技术!我个人认为,算法和数据结构还是要懂一点的。因为算法和数据结构不仅能解决我们在写程序的时候遇到的性能问题,而且还能扩展我们解决问题的方法。
问题的简单描述:反转一颗二叉树。什么是二叉树呢?二叉树就是每个节点最多有两个子树的树。通常,子树被称为“左子树”和“右子树”。本文的任务就是讲一个节点的左右子树交换位置。
首先,我们来构建一颗二叉树。在本次实践中,我准备使用对象指针的方式来构建一颗二叉树。
定义二叉树的节点- 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