图解二叉树节点的查找,插入和删除操作

首先这三种操作都是基于二叉查找树所进行的操作,因此开始之前应该建立二叉查找树。



查找和插入由于比较好理解,直接看代码吧.

查找和插入://这个部分参考胡昭民编著清华出版的数据结构,有所改动。

#include <stdio.h>
#include <stdlib.h>
struct tree
{ 
	int data;
	struct tree *left,*right;
};
typedef struct tree node;
typedef node *btree;
btree creat_tree(btree,int);
btree search_tree(btree,int);
void Output(btree);
int main()
{  
	 int i,num = 0,data[]={5,6,24,8,12,3,17,1,9};
	 btree ptr=NULL,leftroot = NULL, rightroot = NULL;
	 btree root=NULL;
	 for(i=0;i<9;i++)
	 	ptr=creat_tree(ptr,data[i]);       /*建立二叉树*/
	 Output(ptr);
	 printf("请输入要查找的值:\n");
	 scanf("%d",&num);
	 if(search_tree(ptr,num) != NULL)
		 printf("二叉树中已经存在该点\n");
	 else 
	 	creat_tree(ptr,num);
	 Output(ptr);
	 return 0;
}
btree creat_tree(btree root,int val)    /*建立二叉树函数*/
{  
	btree newnode,current,backup;
	newnode=(btree)malloc(sizeof(node));
	newnode->data=val;
	newnode->left=NULL;
	newnode->right=NULL;
	if(root==NULL)
	{  
		root=newnode;
		return root;
	}
	else
	{  
		for(current=root;current!=NULL;)
		{  
			backup=current;
			if(current->data > val)
				current=current->left;
			else
				current=current->right;
		}
	if(backup->data >val)
		backup->left=newnode;
	else
		backup->right=newnode;
	}
	return root;
}
btree search_tree(btree ptr,int value)
{
	while(1)
	{
		if(ptr == NULL)
		return NULL;
		if(ptr->data == value)
		{
			return ptr;
		}
		else
		{
			if(ptr->data > value)
			{
				ptr = ptr->left;
			}
			else
			{
				ptr = ptr->right;
			}
		} 
	}
}
void Output(btree ptr)
{
	if(ptr)
	{
		Output(ptr->left);
		printf("%d ",ptr->data);//中序的输出其实是一种排序,由小到大 
	  	Output(ptr->right);
	 }
}


删除:
可以分为三种情况:

  • 删除的节点为树叶:只需要将与其相连的父节点指向 NULL 即可;
  • 删除的节点只有一颗树,就将其指针放在其父节点的相反方向的指针;
  • 删除的节点为两棵树:用另一节点来代替被删除的节点:右子树的最小元素或者左子树的最大元素;
BinTree Delete(int x,BinTree BST)
{
	BinTree temp;
	if( BST == NULL)
		printf("要删除的元素未找到");
	else if(x < BST->Data )
		BST->Left = Delete(x,BST->left);
	else if(x > BST->Data)
		BST->Right = Delete(x,BST->Right);
	else
	{
		if( BST->Left && BST->Right)
		{
			temp = FindMin(BST->Right);//右子树找最小的节点
			BST->Data = temp->Data;
			BST->Right = Delete(BST->Data,BST->Right);
		}
		else
		{
			temp = BST;
			if( !BST->Left )
				BST = BST->Right;
			else
				BST = BST->Left;
			free(temp);

		}
		
	}
	return BST;
}



删除程序代码图解:
举如下一个二叉树:
图解二叉树节点的查找,插入和删除操作
如要删除左子树中的数值 2 的节点:
图解二叉树节点的查找,插入和删除操作



上一篇:TR LA-41*300 SSI order no.305-00111 TR LA-41 305-0


下一篇:二叉搜索树与双向链表Convert() 输入一个BST,递归方法