数据结构--二叉树

二叉树是一种特殊的树,它的子节点个数不超过两个。二叉树具备一些特殊的计算性质, 使得在它们之上的一些操做异常高效。node

当考虑某种特殊的二叉树,好比二叉查找树时,肯定子节点很是重要。二叉查找树是一种 特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中。这一特性使得 查找的效率很高,对于数值型和非数值型的数据,好比单词和字符串,都是如此。bash

二叉树由节点组成,因此咱们先定义Node类,和链表相似:数据结构

function Node(data){
    this.data = data
    this.left = left
    this.right = right
    this.show = () => this.data 
}
复制代码

一个二叉树的类,初始化的rootnullpost

function BST (){
    this.root = null
    this.insert = insert
    this.inOrder = inOrder //中序遍历
}
复制代码

二叉树的node插入要符合的规则:ui

  1. 设根节点为当前节点。
  2. 若是待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反 之,执行第 4 步。
  3. 若是当前节点的左节点为 null,就将新的节点插入这个位置,退出循环;反之,继续 执行下一次循环。
  4. 设新的当前节点为原节点的右节点。
  5. 若是当前节点的右节点为 null,就将新的节点插入这个位置,退出循环;反之,继续 执行下一次循环。 代码实现以下:
function insert(data){
    let newNode = new Node(data)
    if(this.root === null){
        this.root = newNode //第一次插入的节点替换掉了初始的root
    }else{
        let currNode = this.root
        let parent
        while(true){
            parent = currNode
            if(data<currNode.data){
                currNode = currNode.left
                if(currNode===null){
                    parent.left = newNode
                    break
                }
            }else{
                currNode = currnNode.right
                if(currNode===null){
                    parent.right = newNode
                    break
                }
            }
        }
    }
}
复制代码

另外,因为树并非线性数据结构,因此它的遍历形式也能够分为三种,分别是this

  • 先序遍历:先序遍历先访问根节点,而后以升序访问左子树和右子树。
  • 中序遍历:中序遍历按照节点上的键值,以升序访问BST 上的全部节点;
  • 后序遍历:后序遍历先访问叶子节点,从左子树到右子树,再到根节点。

首先看什么是中序遍历,中序遍历按照节点上的键值,以升序访问BST 上的全部节点, 结合前面说的,相对较小的值保存在左节点中,较大的值保存在右节点中,咱们能够知道中序遍历是先访问最左的叶子节点,而后访问该叶子节点的父节点,再访问该父节点的右叶子节点....遍历的结果是按树全部节点的值从小到大依次排列的。spa

中序遍历顺序以下:code

function inOrder (node){
	if (!(node==null)){
		inOrder(node.left)
		console.log(node.show()+"") //+""会打印出一个字符串
		inOrder(node.right)
	}
}
复制代码

先序遍历的顺序以下:cdn

function preOrder (node){
    if(!(node==null)){
        console.log(node.show())
        preOrder(node.left)
        preOrder(node.right)
    }
}
复制代码

后序遍历的顺序以下:blog

function postOrder (node){
    if(!(node==null)){
        postOrder(node.left)
        postOrder(node.right)
        console.log(node.show())
    }
}
复制代码

二分法查找二叉树上给定的值:

function find(data){
    let currNode = this.root
    while(currNode!=null){
        if(currNode.data===data){
            return currNode
        }
        else if(currNode.data>data){
            currNode = currNode.left
        }
        else{
            currNode = currNode.right   
        }
    }
    return null
}
复制代码
相关文章
相关标签/搜索