这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
题目:翻转一颗二叉树
这个题目相对来说比较简单,但是这题比较火,请看这个题目上的备注,如果使用mac电脑的jym一般会用这个工具brew install来安装一些东西。然后开发这个命令的作者去谷歌面试,谷歌让他在白板上解答这道算法题,但是他没有答上来,结果面试挂了。他就在网上吐槽说谷歌的百分之90的人都用我的工具,但是我写不出来就让我面试挂了。
思路:
- 看题意就是给你一颗二叉树,然后你输出其镜像的二叉树
- 判断节点是否为空,空的话就直接return终止条件
- 使用递归将左右的节点交换,再使用解构的方式分别把左右子树的节点递归翻转然后return结果
答案代码:
var invertTree = function(root) {
//节点为空终止条件
if(root == null) {
return root;
}
//递归
[root.left,root.right] = [invertTree(root.right),invertTree(root.left)]; return root;
}
一、二叉树逻辑
二叉树有三种遍历方式:
- 前序遍历:先遍历自己--》left左节点--》右节点
- 中序遍历:先左节点--》遍历自己节点--》右节点
- 后序遍历:先左节点--》右节点--》遍历自己节点
上图是一个简单的二叉树,通过这三种遍历顺序分别是:
- 前序遍历结果:1--2--4--5--3--6
- 中序遍历结果:4--2--5--1--6--3
- 后序遍历结果:4--5--2--6--3--1
二、总结
这几天写的算法题似乎都用到了递归的方式去实现,虽然在工作中算法方面用的很少,基本上都是增删改查,但是递归用的也蛮多的,例如一些多层级的菜单,树状图的组织架构,二维数组或者多级对象等,用递归会更方便简洁,代码洁癖方便也更好看。所以即使不练习算法题,递归也是要多练练的。
但是你们会考虑一个问题吗?有的人在招聘的时候也有要求必须会算法题,各种算法都会问,或者设计模式之类的,但是实际却可能用不到,这就是设置了一条杠,例如学历必须全日制或者985,211人家更受欢迎,会算法和会设计模式感觉更吃香,哎,继续刷题吧~