二叉查找樹(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;
}
相關文章
相關標籤/搜索