javaScript实现简易二叉树创建

二叉树:在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
在这里插入图片描述
首先我们这张图的二叉树的顶端为八,也被称为根节点

1, 6 则是兄弟节点,同属于3的节点

最底层的4, 7, 13, 则被称为终点节点,又名叶子节点,

散布逻辑

以8作为根节点为例,小于8的则是左子树,大于八的则是右子树,然后然后左右子树在以此类推,

代码实现逻辑

首先我们我们肯定会有个创建根节点的构造函数,和创建子节点的构造函数

建议在chrome下运行,此处打了三个debugger,可以看一下代码的执行顺序,然后看执行时的值

//这里为创建子节点的构造函数
  class BinaryNode {
            constructor(node) {
                this.node = node
                this.right = null
                this.left = null
            }
      }
	//这里是创建根节点的构造函数
	 class BinaryTree { 
            constructor() {
            	//这里为根节点
                this.root = null
            }
            insert(newNode) {
                debugger
                //这里是创建节点
                var newNode = new BinaryNode(newNode)
                //如果已经存在根节点
                if (this.root) {
                	//这里是往根节点赋值
                    this.insertNode(this.root, newNode)
                } else {
                //没有根节点就直接赋值给根节点
                    this.root = newNode
                }
            }
            insertNode(node, newNode) {
                debugger
                //node为上一层根节点,
                //比较值,如果上层节点大于新的值,则往左子树赋值
                if (node.node > newNode.node) {
                	//这里是没有左子树则直接赋值
                    if (node.left === null) {
                        node.left = newNode
                    } else {
                   		//如果左子树有值, 则重新调用此函数,
                        this.insertNode(node.left, newNode)
                    }
                } else {
                    if (node.right === null) {
                        node.right = newNode
                    } else {
                        this.insertNode(node.right, newNode)
                    }
                }
            }
        }

代码逻辑写完了 那我们试着调用以下构造函数

  var nodes = [8, 1, 3, 6, 7, 4, 10, 14, 13]
        var binaryTree = new BinaryTree()
        nodes.forEach(node => {
            debugger
            binaryTree.insert(node)
        })
        console.log(binaryTree.root) //看下图

这是执行完forEach时的结果,顺序展开后和我们最上面的图则是完全一样的;
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章