你会翻转二叉树吗?不会,那对不起滚吧!
事件的起因是 Max Howell 在谷歌面试碰壁之后发推特吐槽 ,大致讲的是:谷歌90%的工程师都使用你写的(Homebrew),但是你不能在白板上写出翻转二叉树,所以你滚吧
连大神在面试的时候都折了戟,为了防止悲剧的再次发生,同志们、同学们我们还是先学学怎么翻转二叉树吧!
下面是从 LeetCode 中摘来的原题目:
其实就题目本身来讲并不算是晦涩难懂的高难度问题,但是这是在我们后来看这道题,如果一开始是你从未见过,我估计很多人也有可能会蒙住吧!下面分别用Objective-C和Python3来解这道题。两种代码中分别给出了递归方式和非递归方式,默认实现了二叉树。
解题思路
Objective-C和Python3的解题思路是完全一致的,基本上就是从把Python3翻译成Objective-C代码。
首先我们看题目中的要求,根节点是 4 ,4 的左子树是 2 ,右子树是 7 ,翻转之后根节点仍然是 4 ,左子树和右子树交换。与此同时,以左子树和右子树为根节点的二叉树都会跟过来,1、3仍然是 2 的子树,6、9也还是 7 的子树。接下来再次分别翻转。
Objective-C代码实现
// 递归翻转
- (void)invertBinaryTreeByRecursion:(Node *)rootNode {
if (rootNode == nil) return;
Node *temp = rootNode.leftChild;
rootNode.leftChild = rootNode.rightChild;
rootNode.rightChild = temp;
[self invertBinaryTreeByRecursion:rootNode.leftChild];
[self invertBinaryTreeByRecursion:rootNode.rightChild];
}
// 非递归翻转
- (void)invertBinaryTree:(Node *)rootNode {
if (rootNode == nil) return;
NSMutableArray *queue = [NSMutableArray arrayWithObject:rootNode];
while (queue.count) {
Node *curNode = queue.firstObject;
[queue removeObjectAtIndex:0];
Node *temp = curNode.leftChild;
curNode.leftChild = curNode.rightChild;
curNode.rightChild = temp;
if (curNode.leftChild) {
[queue addObject:curNode.leftChild];
}
if (curNode.rightChild) {
[queue addObject:curNode.rightChild];
}
}
}
Python3代码实现
# 递归
def invertBinaryTreeByRecursion(self, root):
if root is None:
return
root.lchild, root.rchild = root.rchild, root.lchild
self.invertBinaryTreeByRecursion(root.lchild)
self.invertBinaryTreeByRecursion(root.rchild)
# 非递归
def invertBinaryTree(self, root):
if root is None:
return
queue = [root]
while queue:
curNode = queue.pop(0)
curNode.lchild, curNode.rchild = curNode.rchild, curNode.lchild
if curNode.lchild is not None:
queue.append(curNode.lchild)
if curNode.rchild is not None:
queue.append(curNode.rchild)