二叉查找树

相关概念

查找树(search tree)是一种数据结构,支持多种动态集合操作,即可用作字典,也可以用作优先队列。
二叉树是(binary 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);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值