法1:递归
想法:
- 大问题包含小问题,大小问题是同种问题
- 找到root的左子树和右子树的所有可能路径(从左子树的根到叶子,从右子树的根到叶子)(分为left和right两类),分别与root衔接,得到最终结果
- 找左子树的所有可能的路径(从左子树的根到叶子)(此时左子树的根为新的root’):找到root’的左子树和右子树的所有可能路径(分为left‘和right’两类),分别与root‘衔接,得到最终结果。返回该结果,则是原root的左子树的所有可能路径
- 右子树同理
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {string[]}
*/
var binaryTreePaths = function(root) {
if(root == null) {
return [];
}
if(root.left == null && root.right == null) { // 叶子节点
return ["" + root.val];
}
var temp = root.val + "->";
var output = [], left = binaryTreePaths(root.left),
right = binaryTreePaths(root.right);
var i = 0;
for(i = 0; i < left.length; i++) {
output[output.length] = temp + left[i];
}
for(i = 0; i < right.length; i++) {
output[output.length] = temp + right[i];
} return output;
};
法2:非递归
看了答案,打算将非递归的方法练习一下
想法:
- 按层扫描,用队列存储当前层的节点和节点对应的路径(以该节点为最后一个节点的路径)
- 从队列中取出节点,若该节点为叶子节点,则对应的路径为答案之一
- 队列中存储数组[Treenode, 以Treenode为最后一个节点的路径]
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {string[]}
*/
var binaryTreePaths = function(root) {
if(root == null) {
return [];
}
if(root.left == null && root.right == null) { // 叶子节点
return ["" + root.val];
}
var output = [], array = [];
// array存储数组,数组元素为[Treenode, 以Treenode为最后一个节点的路径]
var length = 0; // 存储当前层root节点的个数(如根节点的左右子树的根节点)
array[array.length] = [root, "" + root.val];
while(array.length > 0) {
length = array.length;
while(length > 0) {
if(array[0][0].left == null && array[0][0].right == null) { // 叶子节点
output[output.length] = array[0][1];
array.shift();
length--;
continue;
}
if(array[0][0].left != null) {
array.push([array[0][0].left, array[0][1] + "->" + array[0][0].left.val]);
}
if(array[0][0].right != null) {
array.push([array[0][0].right, array[0][1] + "->" + array[0][0].right.val]);
}
array.shift();
length--;
}
}
return output;
};