题目描述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
示例:
思路
- 因为是求路径,所以使用
前序遍历,从根节点开始往下找路径。 遍历到叶子节点之后,拼装路径后,返回其父节点(回溯操作)。回溯的目的是为了返回到父节点去遍历另一边的节点!
代码
/**
* 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;
}
总结
以上便是求二叉树路径的思路,如有错误之处,欢迎大家留言指教,谢谢大家了。