二叉树的所有路径

106 阅读1分钟

题目描述

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

示例:

image.png

思路

  1. 因为是求路径,所以使用前序遍历,从根节点开始往下找路径。
  2. 遍历到叶子节点之后,拼装路径后,返回其父节点(回溯操作)。回溯的目的是为了返回到父节点去遍历另一边的节点!

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {string[]}
 */
var binaryTreePaths = function(root) {
    return getPath(root)
};

// 求路径-前序遍历
// 这里使用递归的方法来做:
// 递归三部曲:
// 1. 参数:node(当前节点), pathArr(路径数组),result(结果数组)
// 2. 终止条件:节点为null
// 3. 单层逻辑,中左右的递归遍历节点,每次递归后执行回溯操作。
// 这里采用的是不隐藏回溯的过程的写法。每次递归返回之后,回溯到上一节点

function getPath(node,pathArr=[],result=[]){
    // 将节点放入路径数组中
    pathArr.push(node.val);
    // 如果是叶子节点的话,拼装路径放入result中
    if(node.left==null&&node.right==null){
        result.push(pathArr.join("->"));
        return result;
    }

    if(node.left){ 
        getPath(node.left,pathArr,result);
        pathArr.pop(); //回溯操作,返回上一节点
    }

    if(node.right){ 
        getPath(node.right,pathArr,result);
        pathArr.pop();//回溯操作,返回上一节点
    }

    return result;

}

image.png

总结

以上便是求二叉树路径的思路,如有错误之处,欢迎大家留言指教,谢谢大家了。