二叉树

216 阅读2分钟

二叉树排序

什么是二叉树

定义:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

二叉树特点

  • 每个结点最多有两颗子树,所以二叉树中不存在度大于2个度的结点。
  • 左子树和右子树是有顺序的,次序不能任意颠倒。
  • 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

二叉树性质

  • 二叉树每一层最多节点数为2^n-1。(n>=1)
  • 二叉树第n层一共最多子节点数 2^(n+1)-1。(k>=1)
  • 在完全二叉树中,具有n个节点的完全二叉树的深度为[log2^n]+1。

满二叉树

每个父节点的度都为2的二叉树

完全二叉树

除去最后一层节点,为满二叉树。最后一层从左到右分布

二叉树的遍历

  • 前序遍历

从根节点开始,遍历左子树,若无左子树,则返回父节点遍历右子树。输出第一次遍历的元素 在第一次遍历到节点时就执行操作,一般只是想遍历执行操作(或输出结果)可选用先序遍历

  • 中序遍历
    从根节点开始,遍历左子树,若无左子树,则返回父节点遍历右子树。输出第二次遍历的元素 对于二分搜索树,中序遍历的操作顺序(或输出结果顺序)是符合从小到大(或从大到小)顺序的,故要遍历输出排序好的结果需要使用中序遍历

  • 后序遍历 从根节点开始,遍历左子树,若无左子树,则返回父节点遍历右子树。输出第三次遍历的元素 后续遍历的特点是执行操作时,肯定已经遍历过该节点的左右子节点,故适用于要进行破坏性操作的情况,比如删除所有节点

  • 层序遍历
    从根节点逐层向下遍历,同层从左到右遍历。

访问当前节点的左子树;访问根节点;访问当前节点的右子树;

javascript实现

function binarySort() {
  var Node = function(key){
    this.key = key;
    this.left = null;
    this.right = null;
  }
  var root = null;
  var insertNode = function(node, newNode){
    if(newNode.key < node.key){
      if(node.left === null)
        node.left = newNode;
      else
        insertNode(node.left, newNode);
    }else{
      if(node.right === null)
        node.right = newNode;
      else
        insertNode(node.right, newNode);
    }
  }

  this.insert = function(key){
    var newNode = new Node(key);
    if(root === null)
      root = newNode;
    else 
      insertNode(root, newNode);
  }
};
window.onload = function() {
    alert("hello!this is binarysortTree");
    var nodes = [8,3,10,1,6,14,4,7,13];
    var binaryTree = new binarySort();
    nodes.forEach(function(key){
      binaryTree.insert(key);
    })
}