哎呀,我被5级的坎儿给绊倒了
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

今天早上听静雅思听,有一篇文章说:生老病死,生死太极端了,老和死是一对白发老伴儿,生与病却好像是一对互相依偎的情侣。生病磨炼了我们的灵魂以使我们更好地适应另一个更痛苦的世界。

我今天遭遇了很多不开心,就给你们说一下,让大家开心开心。

我还在外地读书,过两天要乘火车去学校了,车票已早早的在网上定好,学生证每学期有四次优惠,用来买学生半价票的。

今天排了很长的队取票,终于排到我了,哦,你的优惠次数没了。“那我付全票好了”不行,要先退票,然后重新买全票,这个窗口不能退票请到那个窗口重新排队“那先帮我买全票吧,我回去网上退票”同一个身份证只能在同一趟列车上买一张票,你那张票不退,无法买新票

最后怎样?我半价的坐票退掉,然后…坐票没了,我花了一倍的钱买了站票。

Description:

Given the root node of a binary tree (but not necessarily a binary search tree,) write three functions that will print the tree in pre-order, in-order, and post-order.

A Node has the following properties:

var data; // A number or string.
Node left; // Undefined if there is no left child.
Node right; // Undefined if there is no right child.

Pre-order means that we

  1. Visit the root.
  2. Traverse the left subtree (left node.)
  3. Traverse the right subtree (right node.)

In-order means that we

  1. Traverse the left subtree (left node.)
  2. Visit the root.
  3. Traverse the right subtree (right node.)

Post-order means that we

  1. Traverse the left subtree (left node.)
  2. Traverse the right subtree (right node.)
  3. Visit the root.

Let’s say we have three Nodes.

var a = new Node("A");
var b = new Node("B");
var c = new Node("C");

a.left = b;
a.right = c;
  • Then, preOrder(a) should return [”A”, “B”, C”]
  • inOrder(a) should return [”B”, “A”, “C”]
  • postOrder(a) should return [”B”, “C”, A”]

What would happen if we did this?

var d = new Node("D");
c.left = d;
  • preOrder(a) should return [”A”, “B”, “C”, “D”]
  • inOrder(a) should return [”B”, “A”, “D”, “C”]
  • postOrder(a) should return [”B”, “D”, “C”, “A”]

菜鸟我,没做出来

以前在数据结构课上学过,这个叫二叉树,分为前序遍历、中序遍历、后序遍历,也是当时没好好学,现在在 Javascript 上更是不知所措。

各取所长

解法一

function preOrder(node)
{
  if(node == undefined)
    return Array();

  return [node.data].concat(preOrder(node.left)).concat(preOrder(node.right));
}

function inOrder(node)
{
  if(node == undefined)
    return Array();

  return inOrder(node.left).concat([node.data]).concat(inOrder(node.right));
}

function postOrder(node)
{
  if(node == undefined)
    return Array();

  return postOrder(node.left).concat(postOrder(node.right)).concat([node.data]);
}

关键字积累

  • concat

解法二

function doOrder(node, order) {
  var ret = [],
      recurse = function(node) {
        order.forEach(function(part) {
          if(part === "data") {
            ret.push(node.data);
          } else if(node[part]) {
            recurse(node[part]);
          }
        });
      };
  recurse(node);
  return ret;
}

function preOrder(node) {
  return doOrder(node, ['data','left','right']);
}

function inOrder(node) {
  return doOrder(node, ['left','data','right']);
}

function postOrder(node) {
  return doOrder(node, ['left','right','data']);
}

关键词积累

好像没大有啊

菜鸟反思

之前也有几道题没做出来,或者是直接看了答案,但是我重新做另一道题,直到通过为止,才用来写专栏。

一方面是,自己对代码战争的规则不太熟悉,那些题目对自己的帮助也不大;另一方面是,那小题目,在专栏上说自己没做出来,多丢人丫。

今天,我遭遇了生活和编程的双重打击,又想学习那篇文章,视病痛为情人。更何况此题也是老故人了,拉出来给大家介绍认识认识。

我确实是被绊倒了,这不丢人。

评论
发表评论
5年前

@米粽粽 就是个树的遍历啊 0. 0

5年前

@米粽粽 就是个树的遍历啊 0. 0

6年前

@米粽粽 大人,小弟不才,让你失望了。只通过对他人的解法,确实想不到那么多的知识点,何况是我没听过的分治算法,我现在听了,就记住他了。还有那个关键字积累,只是标记一下解法中用到的属性方法而已,将来做分类整理的时候,可以更快的找到相关的例子。希望我每天的积累,能让我在下一级的表现让您满意。

6年前

@米粽粽 这个属于分治算法吗,感觉非常的不典型啊。。

6年前

这个题你应该关注的是递归的 divide and conquer 思路,而不是什么数组的concat方法。看了你最近的几篇都觉得你没有抓到点子,祝你好运……

WRITTEN BY
BoltDoggy
A doggy named Bolt.
TA的新浪微博
PUBLISHED IN
My Code Wars 我的代码战争【休息一下】

这里讲述的是一个8级(kyu)菜鸟立志成为8段(dan)大神的故事。

他在代码战争中一次次遭遇挫败,而又在乱炖中获得高人指点。

遥想当年自高自大,而今终知天外有天。

坚持要走出一条自己的路,这是一条不归路。


Bolt 在写underscore.js源码分析专栏的时候发现了一个问题,就是看别人写的代码的时候自认为看懂了,但实际上有理解错误自己也不知道。

另外就是看了再牛逼的代码,自己写的时候,还是那些小套套。

于是 Bolt 开了一个新专栏:My Code Wars 我的代码战争。在同一需求下,菜鸟写的代码与大神有什么区别,是思维方式不同,还是什么原因导致的?

欢迎大家来新专栏提供意见和建议。

我的收藏