• BST二叉查找树的实现与操作


    教学视频地址

    原文来自猎豹网校


    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node
    {
    	int data;
    	struct Node *lchild;
    	struct Node *rchild;
    }BiTreeNode,*BiTree;
    
    BiTree BSTSearch(BiTree T,int x)
    {
    	BiTreeNode *p;
    	if(T!=NULL)
    	{	
    		p=T;
    		while(p!=NULL)
    		{
    			if(p->data==x)
    				return p;
    			else if(x<p->data)
    				p=p->lchild;
    			else if(x>p->data)
    				p=p->rchild;
    		}
    	}
    	return NULL;
    }
    
    int BSTInsert(BiTree *T,int x)
    {
    	BiTreeNode *p,*cur,*parent=NULL;
    	cur=*T;
    	while(cur!=NULL)
    	{
    		if(cur->data==x)
    			return 0;//已存在关键字为x的节点
    		parent=cur;
    		if(x<cur->data)
    			cur=cur->lchild;
    		else
    			cur=cur->rchild;
    	}
    	p=(BiTreeNode *)malloc(sizeof(BiTreeNode));
    	if(!p)
    		exit(-1);
    	p->data=x;
    	p->lchild=NULL;
    	p->rchild=NULL;
    	if(!parent)
    		*T=p;
    	else if(x<parent->data)//如果关键字小于parent指向的节点,则新节点成为parent左孩子
    		parent->lchild=p;
    	else 
    		parent->rchild=p;
    	return 1;
    }
    //删除结点操作
    void DeleteNode(BiTree *s)
    {
    	BiTree q,x,y;
    	if(!(*s)->rchild)
    	{
    		q=*s;
    		*s=(*s)->lchild;
    		free(q);
    	}
    	else if(!(*s)->lchild)
    	{
    		q=*s;
    		*s=(*s)->rchild;
    		free(q);
    	}
    	else//如果s左右子树都存在,则使s的直接前驱结点代替s,并使直接前驱结点的左子树成为成为双亲节点的右子树结点。
    	{
    		x=*s;
    		y=(*s)->lchild;
    		while(y->rchild!=NULL)//查找s的直接前驱结点y为s的直接前驱结点,x为y的双亲结点
    		{
    			x=y;
    			y=y->rchild;
    		}
    		(*s)->data=y->data;//结点s被y取代
    		if(x!=*s)
    			x->rchild=y->lchild;//使y的左子树成为x的右子树
    		else//如果s的左孩子结点不存在右子树
    			x->lchild=y->lchild;
    		free(y);
    	}
    }
    //删除特定结点操作
    int BSTDelete(BiTree *T,int x)
    {
    	if(!*T)
    	return 0;
    	else
    	{
    		if(x==(*T)->data)
    			DeleteNode(T);
    		else if((*T)->data>x)
    			BSTDelete(&(*T)->lchild,x);
    		else 
    			BSTDelete(&(*T)->rchild,x);
    	}
    }
    
    void InOrderTraverse(BiTree T)
    {
    	if(T)
    	{
    		InOrderTraverse(T->lchild);
    		printf("%4d",T->data);
    		InOrderTraverse(T->rchild);
    	}
    }


  • 相关阅读:
    OCP-1Z0-053-V12.02-69题
    OCP-1Z0-053-V12.02-170题
    OCP-1Z0-053-V12.02-117题
    OCP-1Z0-053-V12.02-222题
    OCP-1Z0-053-V12.02-528题
    OCP-1Z0-053-V12.02-531题
    OCP-1Z0-053-V12.02-532题
    OCP-1Z0-053-V12.02-533题
    OCP-1Z0-053-V12.02-542题
    OCP-1Z0-053-V12.02-68题
  • 原文地址:https://www.cnblogs.com/unclejelly/p/4082164.html
Copyright © 2020-2023  润新知