二叉树排序
什么是二叉树
定义:二叉树是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);
})
}