最近从同事那拿了一本叫《漫画算法》的书,里面图文并茂,非常适合算法入门或者回顾,分享一个我在看书过程中的一个小故事。
当时看到了一段代码,着实让我纠结了一阵:
public static TreeNode createBinaryTree(LinedList<Integer> inputList) {
TreeNode node = null;
if (inputList == null || inputList.isEmpty()) {
return null;
}
Integer data = inputList.removeFirst();
if (data != null) {
node = new TreeNode(data);
node.leftChild = createBinaryTree(inputList);
node.rightChild = createBinaryTree(inputList);
}
return node;
}
刚看到的时候惊讶于原来用递归实现一颗二叉树这么简短,回想自己写过树的经历可能还停留在大三那会编译分析写词法分析的时候。不过仔细一想好像哪里不太对劲,这代码生成的树应该是一颗只有左孩子的树,所有的input都被建到左孩子下面去,右孩子的inputList只会是空的吧,可转念又一想,这内容不是号称有千万次的阅读量,而且还出版成书了,这种低级错误发生的可能性太小了,我再琢磨琢磨。但是怎么办呢,怎么看都不对啊,左子树和右子树分配的inputList肯定得是不同的才行,要我改的话我可能会简单的比如把inputList的平均分成两份,这样也基本能保证二叉树的平衡。总之当时很难受了,过不去了,作为处女座的我纠结的饭都吃不下,总觉得我是不是哪里想错了,差点就准备在本地写出来跑一跑看结果了,但是我忍住了,哈哈。一番心理斗争后我觉得我想得没问题,决定先跳过,明天去公司找同事印证一下我的想法。继续往后看,看到作者调用该方法时输入的参数我极度舒适了,原来我想得没错,人家代码写得也没错:
LinkedList<Integer> inputList = new LinkedList<Integer>(Arrays.asList(new Integer[]{3,2,9,null,null,10,null,null,8,null,4}))
原来在这里等着我呢,我认为input是连续的非null对象,除非所有数据遍历结束才会产生null的情况,但是作者确把null也作为input的一部分,对我来说不失为一个巧妙的实现,不禁感叹一下自己见识短浅了。 思考过程也跳不开固有的思维,如果这里我能想到是不是参数设计上并不如我想的这样我就可以继续往后看而不是纠结的过不去。所以以后看书看到觉得有问题的地方先跳出去,把上下文都看一看,反转可能就在其中。
最后把我一最好哥们曾经送给我的一句话分享给大家共勉:
我以为那是才华,结果只是阅读量太少
网友评论