javascript二叉树

javascript中的二叉树一(binary tree)

  毕业也快2年了,毕业以后就没有认真写过博客了,都是那里学习一下,这里弄一下。学习了也不作笔记,事后就忘记了。我对这种状态打从内心是讨厌的。javascript

  进入正题,今天的笔记是记录javascript二叉树的学习,是很是基本的知识加上一些本身的认识。适合想了解javascript二叉树的萌新,大神请绕路走,固然若是发现有什么理解上的错误,还望不吝赐教。java

                                  ===================漂亮的分割线===================node

  首先说下我对二叉树的理解:数组

    1,二叉树是由一系列有规则的节点构成学习

    2,二叉树每个节点能够当作为对象,必有key(节点值),能够有left(节点),right(节点)这三个属性this

    3,每一个节点的left节点的key一定小于当前key值spa

    4,每一个节点的right节点的key一定大于当前的key值code

  那么假如咱们要把一个数组构成二叉树,须要哪些代码?很简单,记住上面的几点,咱们来一步一步把数组变成二叉树形式对象

  

  一,blog

    1,二叉树是由一系列有规则的节点构成,

       2,二叉树每个节点能够当作为对象,必有key(节点值),能够有left(节点),right(节点)这三个属性

    思考: 数组的每个值将变成二叉树的节点(先无论这个节点怎么排序),那么咱们在循环数组的时候,是否是都要处理下?

    答: 我定义下面一个类,到时候就能够依次实例化为节点了。看下好很差理解...

//节点类
class Node {
    constructor(key) {
        this.left = null
        this.right = null
        this.key = key
    }
}

进一步解释: 当循环数组的时候,就能够把每个数组项,实例化为节点,相似这样new Node(数组Item)

  二,

    3,每一个节点的left节点的key一定小于当前key值

    4,每一个节点的right节点的key一定大于当前的key值

    这2点是生成二叉树的规则。那咱们是否是应该有一个二叉树类呢?

    //二叉树类
    class BinaryTree{

    }

  思考: 二叉树类要哪些东西呢?补充类看下是否是应该这些

//二叉树类
class BinaryTree {
    constructor() {
        this.root = null  //二叉树根节点
    }
    insert (key) {  //插入节点的方法
    }
}

解释: 每个二叉树实例应该都有一个根节点,而后暴露一个能够插入节点的方法(先无论插入规则,后续讲解)

接下来就是重点了: 如何实现插入逻辑能实现上面3,4两点规则呢?

  第一点:咱们要肯定一个根节点,而后在根节点基础上实现二分法

  完善insert方法以下:

  

class BinaryTree {
    constructor() {
        this.root = null
    }
    insert (key) {
        const newNode = new Node(key) // 这里也能够在数组那里执行,但这里能够避免屡次实例操做
        if (this.root === null) {
            this.root = newNode
        } else {
            this.inOrderTraversNode(this.root, newNode)
        }
    }
    inOrderTraversNode (node, newNode) {
    }
}

解释:当调用insert方法的时候都先肯定root的值,而后在根节点为入口进行二分。inOrderTraversNode方法就负责二分法。

 

思考: inOrderTraversNode方法怎么样实现二分法?

答: 该方法为一个递归方法。功能为:有2个参数,一个是当前已经存在的节点,后一个是要插入的新节点,就是把新节点插入到当前节点的正确的(左节点或者右节点)位置。

好比:当根节点肯定以后,调用该方法插入一个新左节点,此时造成了2个节点的二叉树。此时若又一个左节点须要插入,咱们就能能够递归调用该方法实现了。

//二叉树类
class BinaryTree {
    constructor() {
        this.root = null
    }
    insert (key) {
        const newNode = new Node(key)
        if (this.root === null) {
            this.root = newNode
        } else {
            this.inOrderTraversNode(this.root, newNode)
        }
    }
    inOrderTraversNode (node, newNode) {
        if (newNode.key < node.key) { // 左插
            if (node.left === null) {
                node.left = newNode
            }else{
                this.inOrderTraversNode(node.left, newNode)
            }    
        } else { // 右插
            if (node.right === null) {
                node.right = newNode
            } else {
                this.inOrderTraversNode(node.right, newNode)
            }
        }
    }
}

 

全部代码在这里,能够好好理解下

const node = [8, 1, 3, 10, 12, 6, 13, 15, 18, 7]

//节点类
class Node {
    constructor(key) {
        this.left = null
        this.right = null
        this.key = key
    }
}

//二叉树类
class BinaryTree {
    constructor() {
        this.root = null
    }
    insert (key) {
        const newNode = new Node(key)
        if (this.root === null) {
            this.root = newNode
        } else {
            this.inOrderTraversNode(this.root, newNode)
        }
    }
    inOrderTraversNode (node, newNode) {
        if (newNode.key < node.key) { // 左插
            if (node.left === null) {
                node.left = newNode
            }else{
                this.inOrderTraversNode(node.left, newNode)
            }    
        } else { // 右插
            if (node.right === null) {
                node.right = newNode
            } else {
                this.inOrderTraversNode(node.right, newNode)
            }
        }
    }
}

const binaryTree = new BinaryTree()
node.map(function(item) {
    binaryTree.insert(item)
})

console.log(binaryTree.root)
相关文章
相关标签/搜索