【问题标题】:Deserialize Binary Search Tree in JavaScript在 JavaScript 中反序列化二叉搜索树
【发布时间】:2014-06-30 02:54:41
【问题描述】:

输入是具有空值的预序列化 BST。这些值已被读入具有整数和空值的数组。

示例输入

[ 6, 3, null, null, 8, null, 9, null, null ]

想要的输出

{ _root: 
    { value: 6,
      left:  { value: 3, 
               left: null,  
               right: null },
      right: { value: 8,  
               left: null,  
               right: { value: 9,  
                        left: null,   
                        right: null } } } }

这是 BST 的基本界面:

function BinarySearchTree() {
    this._root = null;
}

BinarySearchTree.prototype = {

    //restore constructor
    constructor: BinarySearchTree,

    insert: function(value) {

        //create a new item object, place data in
        var node = {
                value: value,
                left: null,
                right: null
            },

            current;

        // more code (works, but omitted for this question)
    }
};

我们如何反序列化上述输入,从而得到一个 BinarySearchTree?这会是沿着这些路线的递归前序遍历吗?

function deserialize(arr) {
    var result = new BinarySearchTree();
    result._root = arr[0];

    if (arr[1] === null) {
        result._root.left = null;
    }

    if () {
        return null;
    }

    node.left = deserialize(arr);
    node.right = deserialize(arr);

    return result;
}

【问题讨论】:

    标签: javascript algorithm deserialization binary-search-tree


    【解决方案1】:

    所以我假设输入结构将是节点 1,左子节点 1,左孙节点 1,... 右子节点 1,右孙节点 1,...

    我们可以维护一个堆栈来构建树,这有助于轻松检索更高级别,(或者我们可以添加一个指向每个节点的父节点的指针)。

    Java 代码:

    void builTree(Integer input){
    
        Node root = new Node(input[0]);
        Node cur = root;
    
    
        for(int i = 1; i < input.length; i++){
            if(cur.count <=1){
              cur = update(cur,input[i]);
            }else{
               while(cur.count == 2){//This while loop may not necessary
                   cur = cur.parent;   
               }   
              cur = update(cur, s, input[i]);    
            }          
        }
    }
    
    Node update(Node node,  Integer input){
         if(node.count == 0){
           node.left = new Node(input);
           node.left.parent = node;
           node.count++;
           if(input != null){
              return node.left;
           }
         }else if(node.count == 1){           
           node.right = new Node(input);
           node.right.parent = node;
           node.count++;
           if(input != null){
              return node.right;
           }
         }
         return node;
    }
    
    class Node{
       int value , count;//variable count will tell whether a node is full or not
       Node left, right, parent;
    }
    

    【讨论】:

    • @Monthy 如前所述,您可以维护一个指向其父级的指针。所以你只需要保留一个节点cur,它是最新的节点。而当最新节点满了,就更新cur = cur.parent;
    • @Monthy 只是修改了代码来说明我的观点,老实说,我没有任何 JavaScript 经验:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多