二叉查找树(Binary Search Tree)

二叉查找树Binary Search Tree

二叉查找树Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具备下列性质的二叉树php

  1. 若任意节点的左子树不空,则左子树上全部结点的值均小于它的根结点的值;
  2. 任意节点的右子树不空,则右子树上全部结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树。
  4. 没有键值相等的节点(no duplicate nodes)。

二叉查找树相比于其余数据结构的优点在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合multiset关联数组等。node

二叉查找树的查找过程和次优二叉树相似,一般采起二叉链表做为二叉查找树的存储结构。中序遍历二叉查找树可获得一个关键字的有序序列,一个无序序列能够经过构造一棵二叉查找树变成一个有序序列,构造树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操做时,没必要移动其它结点,只需改动某个结点的指针,由空变为非空便可。搜索,插入,删除的复杂度等于树高,指望O(log n),最坏O(n)(数列有序,树退化成线性表).ios

示例代码

#include<iostream>
using namespace std;
typedef int Type;

typedef struct node{
	Type data;
	struct node * left;
	struct node * right;
}BinaryTree;

void findInsertNode(BinaryTree *bt,Type data){
	BinaryTree *point=bt;
	int FlagL=0,FlagR=0;
	while(point){//如有子节点继续查找,若没有就退出,而后插值
		if(data>point->data)
			if(point->right)
				point=point->right;
			else
			{FlagR=1;break;}
		else
			if(point->left)
				point=point->left;
			else
			{FlagL=1;break;}
	}
	BinaryTree *node=new BinaryTree();
	node->data=data;
	node->left=0;
	node->right=0;
	if(FlagR)
		point->right=node;
	else
		point->left=node;
}

BinaryTree * createSortBT(Type data[],int length){
	BinaryTree *bt=new BinaryTree();
	bt->left=0;
	bt->right=0;
	int i=0;
	while(i<length){
		if(0 == i)
			bt->data=data[i++];//建立根
		else{
			findInsertNode(bt,data[i++]);//建立叶子
		}
	}
	return bt;
}

/*中序遍历二叉树bt*/
void InOrder(BinaryTree * bt) 
{
      if (bt==0) return; 	     
      InOrder(bt->left); 
	  cout<<bt->data<<" ";  
      InOrder(bt->right); 
}
int main(){
	Type data[8]={5,4,6,2,10,7,9,8};
	BinaryTree *bt=createSortBT(data,8);
	InOrder(bt);
	getchar();
	return 0;
}
相关文章
相关标签/搜索