前端面试找出二叉树中节点值的和等于固定值的路径
数据结构(二叉树)
首先来了解一下什么是二叉树(Binary tree),它是树形结构的一个重要类型,二叉树的存储结构及其算法都较为简单,二叉树特点是每个结点最多只能有两棵子树,且有左右之分,一个是左侧子节点,一个是右侧子节点;在这里概念性的东西不做过多介绍,大家有兴趣可以私下去了解,直接上题:
如下图:

查找上图二叉树中节点值的和等于固定值的路径,并输出满足条件的所有路径;(例如:节点值的和等于28的路径);
分析: 那明显有两条路径[19,4,5]和[19,8,1],那么它是如何通过代码表达出来呢?大家一看到二叉树这种题,可能由于之前了解的不多,感觉很高端无从下手,脑袋一片空白,首先就自乱阵脚了,那面试的结果就可想而知了,其实二叉树就是一种数据结构,没有那么难,我换一种问法大家就知道了;
var tree={ val:19, left:{ val:4, left:{ val:7, }, right:{ val:5 } }, right:{ val:8, left:{ val:1 }, right:{ val:3 } } };
查找tree对象中val值相加等于28的路径,并输出满足条件的所有路径;这样问大家是不是就好理解多了。其实二叉树就是一种数据结构,没那么难,下回再遇到相信大家肯定是不会晕头转向了。下面来分析一下这道题
var findPath = function (obj, sum) { let arrPath = []; let result = [];//用来存放满足条件的所有路径,最后把这个值return出去 www.dianjilingqu.com let init = 0;var isLeaf = function (root) {//判断是否还有子节点 if (!root.left && !root.right) { return true }; return false; } function computed(root, init, arrPath, result) { arrPath = [...arrPath, root["val"]] init += root["val"]; if (init > sum) { return false }; if (init == sum && isLeaf(root)) { result.push(arrPath) return; }; if (root.left) { computed(root.left, init, arrPath, result); } if (root.right) { computed(root.right, init, arrPath, result); } } computed(obj, init, arrPath, result); return result; }; console.log(findPath(objData, 28));
最后的输出结果:


浙公网安备 33010602011771号