二叉树的字符串表示法,找到距离树根最远的地方

问题描述:

这是一个算法,我刚才给出了一个测试,我无法弄清楚。有任何想法吗?二叉树的字符串表示法,找到距离树根最远的地方

您将得到的二进制树的递归符号:一个树的每个节点被表示为一组三个元素:节点

  • 左子树
  • 右子树

    因此,一棵树可以写为(value left_subtree right_subtree)

    如果节点不存在,则表示为空集:()

    您的任务是从左到右的顺序获取离树根最远的节点列表。

    在一个节点的表示法中,它的值和子树由一个空格字符分隔。

    例子:

    //    2 
    //   /\ 
    //   / \ 
    //  / \ 
    //  /  \ 
    //  /  \ 
    //  7   5 
    // /\   \ 
    // / \   \ 
    // 2  6   9 
    //  /\  /
    //  / \  /
    //  5  11 4 
    
    tree = "(2 (7 (2()()) (6 (5()()) (11()()))) (5() (9 (4()())())))" 
    treeBottom(tree) // Desired output: [5, 11, 4]. 
    
    +1

    再说:二进制搜索树],到目前为止你尝试过什么,你卡在哪里?你可以在你的问题中包含你的代码吗? – Marco

    +2

    括号的每个级别离根都是另一步。因此,最深嵌套层次的非空节点(或多个节点)距离根节点最远。因此,如果您要跟踪当前的嵌套级别以及当前最深的节点,则可以在字符串的单次扫描中执行此操作。 –

    也许不是最先进的解决方案,但它的工作原理..

    var tree = "(2 (7 (2()()) (6 (5()()) (11()()))) (5() (9 (4()())())))"; 
     
    
     
    var level = 0; 
     
    var rootLeafs = [] 
     
    var leaf = -1; 
     
    var i; 
     
    
     
    var parseToken = { 
     
        "(": enterLevel, 
     
        ")": leaveLevel, 
     
        " ": separate, 
     
    } 
     
    
     
    function isValidTreeElement() { 
     
        applyFn = parseToken[tree[i]]||parseNumber; 
     
        return applyFn() 
     
    } 
     
    
     
    function enterLevel() { 
     
        if (i > 0 && tree[i-1] != " ") { 
     
        alert("Nodes must be separated by space"); 
     
        return false; 
     
        } 
     
    
     
        level++; 
     
        // entering new root leaf 
     
        if (level == 2) { 
     
        leaf++; 
     
        rootLeafs[leaf] = []; 
     
        } 
     
        return true; 
     
    } 
     
    
     
    function leaveLevel() { 
     
        level--; 
     
        return true; 
     
    } 
     
    
     
    function separate() { 
     
        if (i > 0 && tree[i-1] == " ") { 
     
        alert("Multiple spaces in row"); 
     
        return false; 
     
        } 
     
        return true; 
     
    } 
     
    
     
    function parseNumber() { 
     
        var advance = tree.substring(i).indexOf(" "); 
     
        if (advance < 1) { 
     
        alert("Number must followed by space"); 
     
        return false; 
     
        } 
     
        var num = Number(tree.substring(i,i+advance)); 
     
        if (isNaN(num)) { 
     
        alert("Expected number, given: " + tree.substring(i,i+advance)); 
     
        return false; 
     
        } 
     
        i += advance - 1; // move index to last char of number 
     
        // add value to current leaf level 
     
        if (level > 1) { 
     
        try { 
     
         rootLeafs[leaf][level-2].push(num); 
     
        } catch(e) { 
     
         rootLeafs[leaf][level-2] = [num]; 
     
        } 
     
        } 
     
        return true; 
     
    } 
     
    
     
    function walk() { 
     
        for (i = 0; i < tree.length; i++) { 
     
        if (!isValidTreeElement()) { 
     
         return; 
     
        } 
     
        } 
     
    
     
        // get last level from each root leaf 
     
        var results = rootLeafs.reduce(function(a, b) { 
     
        return a.concat(b.slice(-1)[0]); 
     
        }, []); 
     
    
     
        console.log('Result: ' + results); 
     
    } 
     
    
     
    walk();

    的事实,这不是一个[标签
    +1

    为什么不创建一个代码片段而不是依靠jsfiddle? – m69

    +0

    @ m69好点 – bigless