【问题标题】:JavaScript implementation of printing left view of binary tree is returning incorrect result打印二叉树左视图的 JavaScript 实现返回不正确的结果
【发布时间】:2016-03-28 04:16:08
【问题描述】:

我正在尝试打印二叉树的左视图,如 geeksforgeeks 上的 here 所示。由于某种原因它不起作用,我怀疑它与max_level 有关。结果是[ 12, 10, 30, 25, 40 ],我期待[12,10,25]

JS代码

var Node = function(val) {
    this.val = val;
    this.left = this.right = null;
};

var leftViewUtil = function(root, level, max, result) {
    if (root === null) return;

    if (max.level < level) {
        max.level = level;
        result.arr.push(root.val);
    }

    leftViewUtil(root.left, ++level, max, result);
    leftViewUtil(root.right, ++level, max, result);
};

var leftView = function(root) {
    var result = {
        arr: []
    };

    var max_level = {level: 0};

    leftViewUtil(root, 1, max_level, result);

    return result.arr;
};

root = new Node(12);
root.left = new Node(10);
root.right = new Node(30);
root.right.left = new Node(25);
root.right.right = new Node(40);

var run = function() {
    console.log(leftView(root));
};

run();

【问题讨论】:

  • 翻译代码时不应删除 cmets :-)
  • Facebook 面试准备中的编码练习,number of visible nodes

标签: javascript node.js recursion binary-tree


【解决方案1】:

使用哈希表在几行代码中找到树的左右视图。

right_view(root,num, result) {
    if(root == null) {
        return 0
    }
    right_view(root.Left, num+1, result)
    right_view(root.Right, num+1, result)
    result[num] = root.Value
}

left_view(root,num, result) {
    if(root == null) {
        return 0
    }
    left_view(root.Left, num+1, result)
    left_view(root.Right, num+1, result)
    if(result[num] == undefined) {
        result[num] = root.Value
    }
}

用根节点调用函数。

right_view_result = {}
right_view(root,1,right_view_result)
console.log(right_view_result)

用根节点调用函数。

left_view_result = {}
left_view(root,1,left_view_result)
console.log(left_view_result)

【讨论】:

    【解决方案2】:

    链接页面上的代码区别是

    // Recur for left and right subtrees
    leftViewUtil(root->left, level+1, max_level);
    leftViewUtil(root->right, level+1, max_level);
    

    leftViewUtil(root.left, ++level, max, result);
    leftViewUtil(root.right, ++level, max, result);
    

    您在这里增加了两次level,而您应该将相同的值传递给两个递归调用。要么正确使用level+1,要么在调用之前进行增量:

    ++level;
    leftViewUtil(root.left, level, max, result);
    leftViewUtil(root.right, level, max, result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2012-01-09
      相关资源
      最近更新 更多