如何在javascript中从数组制作二叉树?

Posted

技术标签:

【中文标题】如何在javascript中从数组制作二叉树?【英文标题】:How to make binary tree from array in javascript? 【发布时间】:2018-02-12 10:16:47 【问题描述】:

我有一个数组var array = [8,10,12,5,3,6];

逻辑

    第一个节点是根节点。 如果新节点值小于或等于=<父节点,则为父节点的左节点 如果新节点值>大于父节点,则为父节点的右节点

我正在尝试实现如下对象的输出:


   value:8,
   left:
      value:5,
      left: value:3 ,
      right:value:6
   ,
   right:
      value:10,
      right:value:12
   

这会是这样的图像

我试过下面的代码:

var arr = [8,10,12,5,3,6];
var root = arr[0];
var rv = ;
for (var i = 0; i < arr.length; i++)
    if(arr[i] < root)
    rv.left = arr[i];
  else
    rv.right = arr[i];
  

console.log(rv);

请帮我解决这个问题。

【问题讨论】:

你试过的代码的输出是什么? 【参考方案1】:

您可以为新节点使用Node 实例,并为插入节点使用函数。

然后迭代这些值并构建一棵新树。

function Node(value) 
    this.value = value;
    // this.left = null;
    // this.right = null;


function insertNode(tree, value) 
    var node = tree,
        key;
    while (node.value !== value) 
         key = value < node.value ? 'left' : 'right';
         if (!node[key]) 
             node[key] = new Node(value);
             break;
         
         node = node[key];
    
    return tree;


var array = [8, 10, 12, 5, 3, 6],
    tree = array.reduce((t, v) => t ? insertNode(t, v) : new Node(v), null);

console.log(tree);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

你没有提到如何为这棵树序列化数组。是按顺序、后序、预序还是完全任意? @Rick,有必要吗? 在代码中,你也可以从树中将它转换回原始数组吗?否则,看起来树和数组之间没有逻辑关系。【参考方案2】:

虽然接近 Nina 的回答,但我认为它更简洁一些;

var data = [8,10,12,5,3,6],
    tree;

function insertBinTree (t = value: void 0, left: void 0, right: void 0, n)
  t.value !== void 0 ? t.value > n ? t.left = insertBinTree(t.left,n)
                                   : t.right = insertBinTree(t.right,n)
                     : t.value = n;
  return t;


tree = data.reduce(insertBinTree, void 0);
console.log(tree);
.as-console-wrapper 
max-height: 100% !important

【讨论】:

【参考方案3】:

通过递归方法尝试这样的事情

var binary = ;
var arr = [8,5,10,3,6,12];

function makeBinary(binary,number)
  if(binary.value === undefined)
    binary.value = number;
  else if(number > binary.value)
    if(binary.right === undefined)
      binary.right = value:number;  
    else
      binary.right = makeBinary(binary.right,number);
    
  else
    if(binary.left === undefined)
      binary.left = value:number;  
    else
      binary.left = makeBinary(binary.left,number);
    
  
  return binary;


for(let i in arr)
  makeBinary(binary,arr[i]);


console.log(binary);

【讨论】:

【参考方案4】:

class Node 
    constructor(val)
        this.val=val;
        this.right=null;
        this.left=null;
    



class Bst
    constructor()
        this.root=null;
    

    insert(val)
        let newNode= new Node (val)
        if (!this.root) this.root=newNode;
    let current =this.root;        
        while (true) 
            if(val === current.val) return undefined;
            if(current.val<val)
                if (current.right===null)
                    current.right=newNode;
                    return this
                
                    else
                    current=current.right
            if(current.val>val)
                if (current.left===null)
                    current.left=newNode;
                    return this
                
                    else
                    current=current.left
                
        
        
    
    
    print ()
        let all="Root=";
    let visit=(current=this.root)=>
        if(!current.left && !current.right)
            if(all[all.length-1]<current.val)
                 all+=`,LeR$current.val`
                 else
                 all+=`,LeL$current.val`
                
else
    if(all[all.length-1]<current.val)
         all+=`,FR$current.val`
         else
                  all+=`,FL$current.val`
            
       
   if (current.left) visit(current.left)
   if (current.right)  visit(current.right)
        
        visit()
        all+=` ,valid bst:$this.isValidBST()`
        return all

    

 isValidBST(node=this.root, min = null, max = null) 
if (!node) return true;
if (max !== null && node.data >= max) 
  return false;

if (min !== null && node.data <= min) 
  return false;

const leftSide = this.isValidBST(node.left, min, node.data);
const rightSide = this.isValidBST(node.right, node.val, max);

return leftSide && rightSide;
    

find(val)
    let found=false
    let innerFind=(current=this.root)=>
    if (val>current.val) 
       if (current.right != null) return innerFind(current.right)
        if(val===current.val)
        found= true 
   else
      if (current.left != null)return innerFind(current.left)
        if(val===current.val)
            found= true 
    return found
        
        return innerFind()
    






let tree=new Bst

tree.insert(8)
tree.insert(10)
tree.insert(13)
tree.insert(3)
tree.insert(1)
tree.insert(6)
tree.insert(4)
tree.insert(7)
tree.insert(2)
tree.print()

【讨论】:

您好,欢迎来到 ***,感谢您的回答。虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。 这实现了一个 BST,其功能包括 Insert print all 并检查 BST 是否有效,并且 find(布尔值,但可以轻松更改)只需复制并粘贴到控制台即可查看它是如何工作的。【参考方案5】:

您可以通过称为递归的技术来做到这一点。 用结构(left_subtree,key,right_subtree)制作一个数组 在你的情况下 var 数组 = [[3,5,6],8,[null,10,12]

class TreeNode 
    constructor(key) 
        this.key = key;
        this.right = null;
        this.left = null;
    


function parseTuple(data) 
    if (data === null) 
        let node = null;
        return node;
    
    else if (data.length === 3) 
        let node = new TreeNode(data[1]);
        node.left = parseTuple(data[0]);
        node.right = parseTuple(data[2]);
        return node;
    
    else 
        let node = new TreeNode(data);
        return node;
    

【讨论】:

以上是关于如何在javascript中从数组制作二叉树?的主要内容,如果未能解决你的问题,请参考以下文章

求二叉树中从根结点到叶子节点的路径

如何从边缘制作二叉树? [关闭]

如何在 JavaScript 中反转二叉树?

如何根据数组创建二叉树?

递归遍历二叉树Javascript的所有嵌套子节点

如何在java中从像素字节数组制作bmp图像