查找(二)——基於二叉排序樹的查找

    導論:首先,沿着二分查找的思路,咱們構造一種二叉樹來查找,這種二叉樹的左子樹結點都小於根節點,右子樹節點都大於根節點,這樣一來,全部結點算是都排好序了,接下來就能夠查找node

 

基於二叉排序樹的查找spa

 

一.二叉排序樹的定義blog

所謂二叉排序樹是一個什麼樣的東西,咱們得弄清楚,如下是二叉排序樹的定義:排序

  1.若它的左子樹非空,則左子樹上全部節點的值都小於根節點的值遞歸

  2.若它的右子樹非空,則右子樹上全部結點的值都大於根節點的值ci

  3.它的左子樹和右子樹也是一顆二叉排序樹class

 

  有了定義,不少東西就都會顯而易見了:二叉樹

  1.二叉排序樹並非一顆徹底二叉樹循環

  2.和二叉斷定樹的對比:二叉斷定樹是一種特殊的二叉排序樹,二叉斷定樹多了一個限定條件:左右子樹的節點數目相差最多不能超過1個(小雨或等於1)程序

      3.二叉排序樹又名二叉查找樹

   

  好了,到這裏給出二叉排序樹的定義

  

typedef struct  _TreeNode
{
	struct _TreeNode *leftNode;
	struct _TreeNode *rightNode;
	TypeData data;
}TreeNode,*TreeRoot;

  

 

 

 

二.二叉排序樹的插入

  和堆的創建和維護相似,咱們首先想解決的一個問題就是:已經有了一顆二叉排序樹,怎樣作到將一個值插入正確的位置,

  給出二叉樹的插入定義

  

TreeNode* Insert_Tree(TreeRoot &root,TypeData key)
{
	if (!root)
	{
		TreeNode *node=new TreeNode;
		node->data=key;
		node->leftNode=nullptr;
		node->rightNode=nullptr;
		root=node;
		return root;
	}
	else if (root->data==key)
	{
		return root;
	}
	else if (root->data<key)
	{
		return (Insert_Tree(root->rightNode,key));
	}
	else if (root->data>key)
	{
		return(Insert_Tree(root->leftNode,key));
	}

}

  

這裏是用遞歸實現的二叉排序樹的插入,要注意如下幾點:

 

    遞歸開始返回的終結點有兩個:

                  1.當根節點爲null時

                  2.根節點的data值和key相等,這個時候就不須要插入了

    插入完畢返回插入位置的結點

 

三.二叉排序樹的創建

    所謂二叉排序樹的創建,也就是經過向一個空節點不斷地插入結點來創建一顆二叉排序樹,經過遞歸地插入,可得

void Create_Tree(TreeRoot& root)
{
	TypeData key;
	while (std::cin>>key)
	{
		Insert_Tree(root,key);
	}
}

  

四.經過二叉排序樹進行查找

    這裏,有兩種方式,遞歸和非遞歸的

    首先是遞歸的

TreeNode *find_InTree(TreeRoot root,TypeData key)
{
	if (root)
	{
		if (root->data==key)
		{
			return root;
		}
		else if (root->data>key)
		{
			return find_InTree(root->leftNode,key);
		}
		else
		{
			return find_InTree(root->rightNode,key);
		}
	}
	return nullptr;
}

  而後是非遞歸的,用while循環代替遞歸達到遞歸的做用

TreeNode *find_InTree2(TreeRoot root,TypeData key)
{
	TreeNode* p=root;
	while (p)
	{
		if (p->data==key)
		{
			return p;
			break;
		}
		else if (p->data>key)
		{
			p=p->leftNode;
		}
		else
		{
			p=p->rightNode;
		}
	}
	return nullptr;
}

  

 

 

最後,簡單地分析一下查找的時間複雜度吧!

    二叉排序樹的插入過程:很明顯,二叉排序樹過程最好狀況是O(log2(n)),最差狀況是O(n),最差的狀況時:二叉樹變爲一顆只有左子樹或者只有右子樹的二叉樹,整個插入過程也退化成爲順序插入

    二叉排序樹的建立過程:很明顯,假設有n個數,創建二叉排序樹就要while循環n次插入過程,也就是說建立過程爲O(nlog2(n))~O(n²)之間

    二叉排序樹的查找過程:很明顯,基於二叉排序樹的查找過程和二叉排序樹的插入過程相似,時間複雜度也爲O(log2(n))到O(n)之間

 

最後,程序執行過程使這樣的:

 

排序二叉樹的建立過程;

排序二叉樹的查找過程;

這樣看來,整個過程的時間複雜度爲O(nlog2(n)到O(n²))之間,可是實際上表述的時候咱們一般忽略建立過程,只考慮二叉樹的查找過程,這樣看來的話,整個過程的時間複雜度爲O(log2(n))到O(n)之間

相關文章
相關標籤/搜索