JavaScript|LeetCode|搜索|257.二叉树的所有路径

法1:递归
想法:

  1. 大问题包含小问题,大小问题是同种问题
  2. 找到root的左子树和右子树的所有可能路径(从左子树的根到叶子,从右子树的根到叶子)(分为left和right两类),分别与root衔接,得到最终结果
  3. 找左子树的所有可能的路径(从左子树的根到叶子)(此时左子树的根为新的root’):找到root’的左子树和右子树的所有可能路径(分为left‘和right’两类),分别与root‘衔接,得到最终结果。返回该结果,则是原root的左子树的所有可能路径
  4. 右子树同理
/** 
* 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:非递归
看了答案,打算将非递归的方法练习一下
想法:

  1. 按层扫描,用队列存储当前层的节点和节点对应的路径(以该节点为最后一个节点的路径)
  2. 从队列中取出节点,若该节点为叶子节点,则对应的路径为答案之一
  3. 队列中存储数组[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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值