二叉排序樹是一種實現動態查找的樹表,又稱二叉查找樹。node
二叉排序樹的性質:算法
1. 若它的左子樹不爲空,則左子樹上全部節點的鍵值均小於它的根節點鍵值spa
2. 若它的右子樹不爲空,則右子樹上全部節點的鍵值均大於它的根節點鍵值指針
3. 根的左右子樹也分別爲二叉排序樹code
#include <stdio.h> #include "BinTree.h" // 二叉排序樹的查找算法 /* // 二叉鏈表的類型定義 typedef struct btnode { int key; struct btnode *lchild, *rchild; // 指向左右孩子的指針 }*BinTree; // 三叉鏈表的類型定義 typedef struct ttnode { int data; struct ttnode *lchild, *parent, *rchild; }*TBinTree; */ /* 在根指針所指的二叉排序樹上遞歸地查找鍵值等於key的節點。 若成功,則返回指向該節點的指針,不然返回空指針。 */ BinTree SearchBST(BinTree bst, int key) { if(bst == NULL) return NULL; else if(key == bst->key) return bst; else if(key < bst->key) return SearchBST(bst->lchild, key); else return SearchBST(bst->rchild, key); }
二叉排序樹插入節點blog
#include <stdio.h> #include "BinTree.h" // 二叉排序樹的查找算法 /* // 二叉鏈表的類型定義 typedef struct btnode { int key; struct btnode *lchild, *rchild; // 指向左右孩子的指針 }*BinTree, BSTNode; */ // 二叉排序樹的節點插入方法 /* 在二叉排序樹上進行插入的原則是:必需要保證插入一個新節點後,仍爲一棵 二叉排序樹。這個節點是查找不成功時查找路徑上訪問的最後一個節點的左孩子 或右孩子。 */ /* 在根指針所指的二叉排序樹上遞歸地查找鍵值等於key的節點。 若成功,則返回指向該節點的指針,不然返回空指針。 指針f爲查找節點的雙親,初始值爲NULL */ BinTree SearchBST(BinTree bst, int key, BSTNode *f) { if(bst == NULL) return NULL; else if(key == bst->key) return bst; else if(key < bst->key) return SearchBST(bst->lchild, key, bst); else return SearchBST(bst->rchild, key, bst); } // 若根指針bst所指的二叉排序樹上無鍵值爲key的節點, // 則插入這個節點,並返回1,不然返回0. int InsertBST(BinTree bst, int key) { BSTNode *p, *t, *f; f = NULL; t = SearchBST(bst, key, f); // 查找不成功時插入新節點 if(t==NULL) { p = malloc(sizeof(btnode)); p->key = key; p->lchild = NULL; p->rchild = NULL; // 若是查找節點的雙親不存在,被插入節點爲新的根節點 if(f == NULL) bst = p; else if(key < f->key) f->lchild = p; else f->rchild = p; return 1; } else // 查找成功時不用插入 return 0; }