javascript关于树的题目
以下代码结果运行结果是什么?为什么?
let cache,
result = Infinity;
function fun(tree) {
if (!tree) return;
fun(tree.left);
if (cache) {
result = Math.min(result, Math.abs(cache - tree.value));
}
cache = tree.value;
fun(tree.right);
}
const tree = {
value: 90,
left: {
value: 50,
left: {
value: 20,
left: {
value: 5,
left: null,
right: null
},
right: {
value: 25,
left: null,
right: null
}
},
right: {
value: 75,
left: {
value: 66,
left: null,
right: null
},
right: {
value: 80,
left: null,
right: null
}
}
},
right: {
value: 150,
left: {
value: 95,
left: {
value: 92,
left: null,
right: null
},
right: {
value: 111,
left: null,
right: null
}
},
right: {
value: 175,
left: {
value: 166,
left: null,
right: null
},
right: {
value: 200,
left: null,
right: null
}
}
}
};
fun(tree);
console.log(result);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
猜一遍,跑一遍,搞不懂,跟一遍
上面是之前的回答。还是正儿八经回答一下吧。不是直接的答案,是方法:
这个问题的关键在于
fun()
函数,这个函数是一个递归调用函数。递归一般按照数学归纳法来思考,如果忘了这个方法,可以先去复习一下。关于递归,要注意两个要点:
来分析一下
fun
函数,可以发现递归函数处理的,都是具有相似特性的数据结构,在这个例子中,是一个树的节点,它的结构是这样的
而
fun
已经描述了对其中一个节点的处理过程:先处理左支(递归),再处理数据(计算),再处理右支(递归)
两个分支的处理是递归调用点,它们的处理过程和当前节点一模一样(都是
fun
函数,能不一样吗),所以只要把当前节点处理好的,其他的都不在话下这里还缺个结束点,怎么找?
很容易明白,
left
、right
为null
的时候就是结束点,所以可以在fun(tree.left)
之前判断(以左为例,右相同),比如这样,只要
left
为空,就不会递归调用,只要当前函数这次执行完成都没有递归调用,就结束了(结束点找到了)。right
相同。或者,也可以换个思维,反正对
left
和right
都要调用fun()
,它们为作为形参tree
传入,那一开始就判断tree
是否为null
就只需要一次判断就行,也就是例中的首行:如果
tree
为空,直接退出函数,函数本次执行没有进行任何递归调用即结束,结束点在这里。上面用两种方法找到了结束点,结束点略有不同,但作用一样。区别就在于一个多写两个判断,另一个多调一次
fun()
。前面把道理讲完了,接下来完全可以在脑袋里模拟运行(如果空间想像能力略差,那就调试模式下跟一遍):
我给前面几个节点的处理步骤,大概是这样:
好像回到了当年百度知道上面帮人做作业。