二叉搜索树的基本操作

来源:互联网 发布:mac粉底液专柜价 编辑:程序博客网 时间:2024/05/18 11:26

本文主要介绍二叉搜索树的C语言代码实现,关于二叉搜索树的讲解后续会补充。下面是代码实现:

//--------------------------二叉搜索树--------------------//定义二叉搜索树节点的结构体typedef struct BinaryTree{int m_value;BinaryTree *m_left;BinaryTree *m_right;BinaryTree *m_parent;}BinaryTree;//二叉搜索树插入节点void InsertTreeNode(BinaryTree *pHead, BinaryTree *newNode){BinaryTree *preNode = NULL;BinaryTree *node = pHead;while(node){preNode = node;if(newNode->m_value > node->m_value)node = node->m_right;elsenode = node->m_left;}newNode->m_parent = preNode;if(newNode->m_value > preNode->m_value)preNode->m_right = newNode;elsepreNode->m_left = newNode;}//创建二叉搜索树BinaryTree *CreateTree(BinaryTree *pHead){if (pHead == NULL)return NULL;int value = 0;printf("please input head node:");scanf("%d",&value);pHead->m_value = value;pHead->m_parent = NULL;pHead->m_right = NULL;pHead->m_left = NULL;printf("please input node value:");scanf("%d",&value);while(value != -1){BinaryTree* tmp = (BinaryTree*)malloc(sizeof(BinaryTree));tmp->m_value = value;tmp->m_parent = NULL;tmp->m_right = NULL;tmp->m_left = NULL;InsertTreeNode(pHead,tmp);printf("please input node value:");scanf("%d",&value);}return pHead;}//中序遍历void InoderTreeNode(BinaryTree* pHead){if(pHead == NULL){return;}InoderTreeNode(pHead->m_left);printf("%d  ",pHead->m_value);InoderTreeNode(pHead->m_right);}//二叉搜索树的查询bool Tree_Search(BinaryTree *pHead, int value){if(pHead == NULL)return NULL;BinaryTree *tmp = pHead;while(tmp && tmp->m_value != value){if(tmp->m_value > value)tmp = tmp->m_left;elsetmp = tmp->m_right;}if(tmp)return true;elsereturn false;}//二叉搜索树的最小值对应的的节点BinaryTree *Tree_Minimum(BinaryTree *pHead){if(pHead == NULL)return NULL;BinaryTree *tmp = pHead;while(tmp->m_left)tmp = tmp->m_left;return tmp;}//二叉搜索树最大的节点BinaryTree *Tree_Maximum(BinaryTree *pHead){if(pHead == NULL)return NULL;BinaryTree *tmp = pHead;while(tmp->m_right)tmp = tmp->m_right;return tmp;}//二叉搜索树节点的前驱节点BinaryTree *Tree_Successor(BinaryTree *pHead, BinaryTree *x){if(pHead == NULL)return NULL;if(x->m_right)return Tree_Minimum(x->m_right);BinaryTree *p = x->m_parent;while(p != NULL && x == p->m_right){x = p;p = p->m_parent;}return p;}//二叉搜索树节点替代,用v代替uvoid TransPlant(BinaryTree *pHead,BinaryTree *u, BinaryTree *v){if(u->m_parent == NULL)pHead = v;else if(u == u->m_parent->m_left)u->m_parent->m_left = v;elseu->m_parent->m_right = v;if(v != NULL)v->m_parent = u->m_parent;}//二叉搜索树节点的删除节点void Tree_DeleteNode(BinaryTree *pHead, BinaryTree *delNode){if(pHead == NULL)return;BinaryTree *tmp = pHead;BinaryTree *y = NULL;if(delNode->m_left == NULL)TransPlant(pHead,delNode,delNode->m_right);else if(delNode->m_right == NULL)TransPlant(pHead,delNode,delNode->m_left);else{y = Tree_Minimum(delNode->m_right);if(y->m_parent != delNode){TransPlant(pHead,y,y->m_right);y->m_right = delNode->m_right;y->m_right->m_parent = y;}y->m_left = delNode->m_left;y->m_left->m_parent = y;}}int main(){//构造根节点BinaryTree *pHead = NULL;pHead = (BinaryTree *)malloc(sizeof(BinaryTree));pHead = CreateTree(pHead);//构造二叉搜索树if(pHead == NULL)return -1;InoderTreeNode(pHead);//中序遍历二叉搜索树,由性质知,中序遍历为数值的递增排序//在树中插入一个节点,节点的数值需要手动输入int value = 0;printf("please input insert node value:");//插入节点值scanf("%d",&value);BinaryTree *node1 = (BinaryTree*)malloc(sizeof(BinaryTree));node1->m_value = value;node1->m_parent = NULL;node1->m_left = NULL;node1->m_right = NULL;InsertTreeNode(pHead,node1);InoderTreeNode(pHead);//二叉树的查找int value2 = 0;printf("please input search node value:");scanf("%d",&value2);bool bo = Tree_Search(pHead,value2);printf("%d\n",bo);//二叉树节点的前驱printf("tree node successor: ");BinaryTree *node2 = Tree_Successor(pHead,node1);printf("%d\n",node2->m_value);//二叉树删除节点printf("delete node: ");Tree_DeleteNode(pHead,node2);InoderTreeNode(pHead);return 0;}


原创粉丝点击