算法题解-二叉树的所有路径

91 阅读2分钟

题目

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

输入: root = [1,2,3,null,5]
输出: ["1->2->5","1->3"]

题解

第一种

我们在函数中定义了两个数组path和result,path用来存储当前遍历的路径,result用来存储所有的路径,然后我们在定义了一个内部函数traversal,它用来遍历二叉树,它接收三个参数,分别是当前节点,当前路径,以及结果数组,在遍历中我们首先将当前节点的值加入到路径中,如果当前节点是叶子节点,就将当前路径转换成字符串,并加入到结果数组中,同时清空路径,然后我们判断如果当前节点有左子节点,就递归遍历左子节点,并在递归之前将当前节点加入到路径中,如果当前节点有右子节点,同样递归遍历右子节点,并在递归之前将当前节点加入到路径中,在递归返回之前,需要将当前节点从路径中弹出,以便继续遍历其他可能的路径,最后,在主函数中调用traversal函数遍历二叉树,并返回结果数组result即可

var binaryTreePaths = function(root) {
    const path = [], result = []
    const traversal = function (root, path, result) {
        path.push(root.val)
        if (!root.left && !root.right) {
            result.push(path.join('->'))
            path = []
        }
        if (root.left) {
            traversal(root.left, path, result)
            path.pop()
        }
        if (root.right) {
            traversal(root.right, path, result)
            path.pop()
        }
    }
    traversal(root, path, result)
    return result
};

第二种

我们首先定义了两个变量res和stack,res用来存储所有路径,stack用来模拟遍历二叉树的过程,初始时将根节点和空字符串加入到栈中,然后我们使用循环,只要栈不为空,就从栈中弹出一个节点和对应的路径字符串,如果该节点是叶子节点,就将该节点的值加入到路径字符串中后并将该字符串加入到结果数组res中,否则,将该节点的值加入到路径字符串中,并在该字符串后面加上“->”,表示该节点是路径中的一个中间节点,然后我们判断如果该节点有右子节点,就将右子节点和更新后的路径字符串加入到栈中,如果该节点有左子节点,也将左子节点和更新后的路径字符串加入到栈中,我们这里需要先将右子节点加入栈中,这是因为栈是后进先出的数据结构,这样可以保证左子节点先被遍历到,最后,在函数的末尾返回结果数组res即可

var binaryTreePaths = function(root) {
    let res = []
    let stack = [[root, '']]
    while(stack.length) {
        let [n, str] = stack.pop() 
        if(!n.left && !n.right) {
            str += n.val  
            res.push(str) 
        } else {
            str += n.val + '->' 
            if(n.right) stack.push([n.right, str])
            if(n.left) stack.push([n.left, str])
        }
    }
    return res
};

坚持努力,无惧未来!