前端面试找出二叉树中节点值的和等于固定值的路径

数据结构(二叉树)
首先来了解一下什么是二叉树(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));

最后的输出结果:

 

posted @ 2022-01-24 13:01  元宇宙-Metaverse  阅读(97)  评论(0)    收藏  举报