相关概念
查找树(search tree)是一种数据结构,支持多种动态集合操作,即可用作字典,也可以用作优先队列。
二叉查找树(binary search tree)是按二叉树结构来组织的。需要满足一下特性:
左子树不为空时,左子树上所有节点的值不大于其根节点的值
右子树不为空时,右子树上所有节点的值不小于其根节点的值
所有节点的左右子树,都分别为二叉查找树
遍历二叉查找树
一般有三种遍历模式,前序遍历,中序遍历,后序遍历。这个顺序是相对根节点而言的,前序遍历就是先根再左右,中序是左根中,后序是先左右最后根
下面是c语言实现
首先是节点的数据结构
struct Node_Dual
{
int m_nValue; // value of node
struct Node_Dual *m_pLeft; // left child of node
struct Node_Dual *m_pRight; // right child of node
};
typedef struct Node_Dual BSTreeNode;
然后是二叉树的建立:
static BSTreeNode * createBSTreeNode(int value){
BSTreeNode *pBSTree=(BSTreeNode *)malloc(sizeof(BSTreeNode));
pBSTree->m_nValue = value;
pBSTree->m_pLeft = NULL;
pBSTree->m_pRight = NULL;
return pBSTree;
}
static void addBSTreeNode(BSTreeNode *root, int value){
if(root==NULL)return;
if(root->m_nValue > value){//add to the left
if(root->m_pLeft==NULL){
root->m_pLeft = createBSTreeNode(value);
}else{
addBSTreeNode(root->m_pLeft,value);
}
}else if(root->m_nValue < value){//add to the right
if(root->m_pRight==NULL){
root->m_pRight = createBSTreeNode(value);
}else{
addBSTreeNode(root->m_pRight,value);
}
}else{
printf("error same value!!!\n");
return;
}
}
BSTreeNode* buildBSTree(int a[],int length){
if (a==NULL||length<=0)return NULL;
BSTreeNode * pRoot = createBSTreeNode(a[0]);
for(int i=1;i<length;i++){
addBSTreeNode(pRoot, a[i]);
}
return pRoot;
}
前序遍历
void PreorderTraversal(BSTreeNode *root){
if(root==NULL) return;
printf("%d,",root->m_nValue);
if(root->m_pLeft!=NULL){
PreorderTraversal(root->m_pLeft);
}
if(root->m_pRight!=NULL){
PreorderTraversal(root->m_pRight);
}
}
中序遍历
void InorderTraversal(BSTreeNode *root){
if(root==NULL) return;
if(root->m_pLeft!=NULL){
InorderTraversal(root->m_pLeft);
}
printf("%d,",root->m_nValue);
if(root->m_pRight!=NULL){
InorderTraversal(root->m_pRight);
}
}
后序遍历
void PostorderTraversal(BSTreeNode *root){
if(root==NULL) return;
if(root->m_pLeft!=NULL){
PostorderTraversal(root->m_pLeft);
}
if(root->m_pRight!=NULL){
PostorderTraversal(root->m_pRight);
}
printf("%d,",root->m_nValue);
}