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