Linux學習筆記(演算法與資料結構)之 二叉搜尋樹程式碼(C語言)
阿新 • • 發佈:2018-12-13
1、程式碼在VS2010的C++編譯器中編譯通過,可能有極少部分語法不符合C99標準;bool型別無法使用,用int代替
2、由於VS配置問題,沒有分.c和.h檔案書寫;如果要分,最好將Create_Node和Destory_Node加上static關鍵字修飾,他們只會在所屬的.c檔案中使用。
3、用C實現需要用到二級指標...比較繁瑣,C++中可以用引用代替。
4、國慶放假了,等會趕火車回家...實在沒想到二叉搜尋樹寫了一個下午...所以二叉搜尋樹的大小size和高度heigth沒有加入到程式碼實現中;批量刪除某個數的功能也沒有實現;釋放記憶體的Deinit也沒有實現...
// Cpp_Study.cpp : 定義控制檯應用程式的入口點。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> /* ******************************************************************* 結構體:表示二叉搜尋樹上的一個節點,包含3個成員變數 ******************************************************************* */ typedef struct BsTree_Node { int data; //該節點儲存的資料 BsTree_Node* left; //該節點的左子節點 BsTree_Node* right; //該節點的左子節點 } BSTREE_NODE; /* ******************************************************************* 結構體:表示二叉搜尋樹(或者說二叉搜尋樹的第0層) ******************************************************************* */ typedef struct BsTree { BSTREE_NODE* root; //記錄樹的根節點 } BSTREE; /* ******************************************************************* 函式功能:根據引數data建立新的節點儲存data的值,返回新建立的節點的地址 ******************************************************************* */ static BSTREE_NODE* Create_Node(int data) { BSTREE_NODE* bstree_node = (BSTREE_NODE*)malloc(sizeof(BSTREE_NODE)); //為新節點申請空間 bstree_node->data = data; //賦初值 bstree_node->left = NULL; bstree_node->right =NULL; return bstree_node; } /* ******************************************************************* 函式功能:在以一個以root為根的子樹中,插入新節點new_node 形參BSTREE_NODE** root,代表儲存在根節點中儲存左子節點地址的記憶體空間的地址 ******************************************************************* */ static void Insert(BSTREE_NODE* new_node,BSTREE_NODE** root) { if (*root == NULL) //如果要插入的地方本身為空,則插在此處;並將父親節點的左節點指標指向new_node { *root = new_node; return ; } else if (new_node != NULL) { if (new_node->data <= (*root)->data) //小於等於父節點的值則往左走 Insert(new_node,&(*root)->left); else Insert(new_node,&(*root)->right); //大於父節點的值則往左走 } } /* ******************************************************************* 函式功能:在以一個以root的子節點為根的子樹中,尋找data值,返回找到的data值所在的節點地址 形參BSTREE_NODE** root,代表儲存在根節點中儲存左子節點地址的記憶體空間的地址 ******************************************************************* */ static BSTREE_NODE** Find(int data,BSTREE_NODE** root) { if ((*root) == NULL) //如果父親節點指向正在搜尋的節點的指標為空,代表該指標不存在 //即已經搜尋到最後一層,則返回NULL代表未找到 return NULL; if ((*root)->data > data) //要尋找的值小於該節點的值,左走 return Find(data,&(*root)->left); if ((*root)->data < data) //要尋找的值大於該節點的值,右走 return Find(data,&(*root)->right); return root; //要尋找的值等於該節點的值,返回該節點地址 } /* ******************************************************************* 函式功能:中序遍歷二叉搜尋樹 ******************************************************************* */ static void traval(BSTREE_NODE* bstree_node) { if (bstree_node == NULL) return ; traval(bstree_node->left); printf("%d ",bstree_node->data); traval(bstree_node->right); } /* ******************************************************************* 函式功能:初始化一個二叉搜尋樹,主要是賦值 ******************************************************************* */ void BsTree_Init(BSTREE* bstree) { bstree->root = NULL; bstree->root = 0; } /* ******************************************************************* 函式功能:在二叉搜尋樹中,插入新值data。通過呼叫內部介面函式實現 ******************************************************************* */ void BsTree_Insert(BSTREE* bstree,int data) { Insert(Create_Node(data),&bstree->root); } /* ******************************************************************* 函式功能:在二叉搜尋樹中,刪除一個值為data的節點 需要呼叫內部介面函式find尋找該值所在節點的地址 找到之後,將該節點的左子樹加入到右子樹中,用右子樹根節點代替該節點即可 ******************************************************************* */ void Bstree_erase(BSTREE* bstree,int data) { BSTREE_NODE** root = Find(data,&bstree->root); if (! *root) return ; Insert((*root)->left,&(*root)->right); BSTREE_NODE* tmp = (*root); (*root) = (*root)->right; (*root)->left = NULL; free(tmp); } /* ******************************************************************* 函式功能:將一個數改為另一個數 ******************************************************************* */ void BsTree_update(BSTREE* bstree,int oldData,int newData) { BSTREE_NODE ** tmp = Find(oldData,&(bstree->root)); if (tmp == NULL) return ; (*tmp)->data = newData; } /* ******************************************************************* 函式功能:查詢一個樹是否存在於二叉搜尋樹中 ******************************************************************* */ void BsTree_exist(BSTREE* bstree,int data) { BSTREE_NODE** tmp = Find(data,&(bstree->root)); if (tmp != NULL) printf("\n%d exist!\n",data); else printf("\n%d do not exist!\n",data); } /* ******************************************************************* 函式功能:中序遍歷二叉樹,呼叫內部介面函式travel ******************************************************************* */ void BsTree_traval(BSTREE* bstree) { printf("\n"); traval(bstree->root); printf("\n"); } /* ******************************************************************* 函式功能:獲取二叉搜尋樹大小,程式還未實現 ******************************************************************* */ int BsTree_Size(BSTREE* bstree); /* ******************************************************************* 函式功能:獲取二叉搜尋樹高度,程式還未實現 ******************************************************************* */ int BsTree_Height(BSTREE* bstree); void main(void){ BSTREE bstree; BsTree_Init(&bstree); while(1) { printf("\nplease input the number of operation:\n1.Insert 2.update 3.traval 4.exist:"); int a,b,c; scanf("%d",&a); if (a == 1) { scanf("%d",&b); BsTree_Insert(&bstree,b); } else if (a == 2) { scanf("%d%d",&b,&c); BsTree_update(&bstree,b,c); } else if (a == 3) { BsTree_traval(&bstree); } else if (a == 4) { scanf("%d",&b); BsTree_exist(&bstree,b); } } }