二叉搜索树的删除

一,二叉搜索树的删除

首先,我们要删除二叉搜索树树中的节点必须保证逻辑完备性,也就是删除完后的二叉树性质不变(左小右大),由于度不同的节点删除难度也不一样我们可以分类讨论

a.度为0的节点:直接删除

b.度为1的节点:把度为1的节点的子节点补上

c.度为2的节点:转移矛盾,改为删除度为2节点左子树的最大值或右子树的最小值

代码逻辑

a.递归写法

删除树中节点,传入参数,树、要删的值,

定义内部函数用于删除节点,内部函数传参,树、节点、要删的值,

小于往左大于往右找到待删点,或者不存在

判断待删点的度是左还是右还是都有

如果是都有,找待删点右边极小值或者左边极大值,将待删点的值换成找到的值,将找到的值删除

二,递归写法代码实现(找右子树最小值)

 

static BSTNode* MinBSTNode(BSTNode*node) {
	while (node&&node->left) {
		node=node->left;
	}
	return node;
}

static BSTNode* deleteBSTNode(BSTree*tree,BSTNode*node,Element data) {
	if (node==NULL) {
		return NULL;
	}
	//递归找到待删点
	if (datadata) {
		//小往左
		node->left=deleteBSTNode(tree,node->left,data);
	}else if (data>node->data) {
		//大往右
		node->right=deleteBSTNode(tree,node->right,data);
	}else {
		if (node->left==NULL) {
			BSTNode*temp=node->right;
			free(node);
			tree->count--;
			return temp;
		}
		if (node->right==NULL) {
			BSTNode*temp=node->left;
			free(node);
			tree->count--;
			return temp;
		}
		BSTNode*MinNode=MinBSTNode(node->right);
		node->data=MinNode->data;
		node->right=deleteBSTNode(tree,node->right,MinNode->data);
		tree->count--;
	}
	return node;
}

void deleteBSTree(BSTree *tree, Element data) {
	if (tree) {
		tree->root=deleteBSTNode(tree,tree->root,data);
	}
}

三,插入的非递归写法代码实现 

static BSTNode*createBSTNode(Element e) {
	BSTNode*node=malloc(sizeof(BSTNode));
	if(node == NULL) {
		return NULL;
	}
	node->data=e;
	node->left=node->right=NULL;
	return node;
}

static BSTNode * insertBSTNode(BSTree *tree,BSTNode *node, Element e) {
	if (node == NULL) {
		tree->count++;
		return createBSTNode(e);
	}
	if (edata) {
		node->left=insertBSTNode(tree,node->left,e);
	}else if (e>node->data) {
		node->right=insertBSTNode(tree,node->right,e);
	}
	return node;
}

BSTNode * insertBSTree(BSTree *tree, Element e) {
#ifdef switch
	//非递归
	BSTNode*cur=tree->root;
	BSTNode*prev=NULL;
	while (cur) {
		prev=cur;
		if (edata) {
			cur=cur->left;
		}else if (e>cur->data) {
			cur=cur->right;
		}else {
			return NULL;
		}
	}
	if (prev) {
		if (edata) {
			prev->left=createBSTNode(e);
		}else if (e>prev->data) {
			prev->right=createBSTNode(e);
		}
	}else {
		tree->root=createBSTNode(e);
	}
	tree->count++;
	return tree->root;
#else
	//递归
	BSTNode*node=insertBSTNode(tree,tree->root,e);
	tree->root=node;
	return node;
#endif
}

你可能感兴趣的:(数据结构,算法)