二叉排序樹

1、僞代碼

1.尋找

if(T爲空){
	    返回	
	}
	if (s->data > T->data){
		T->rchild=s;
        返回;
	}
	遞歸T->rchild;
	else if(s->data<T->data){
		if(T->lchild爲空){
		   T->lchild=s;
		   返回;
		}
		遞歸T->lchild;
	}
}

2.插入

if(樹爲空){
		s爲根節點;
	}
	else{
	    SearchNode(tree, s);	
	}
}

3.建立

for(i=0;i<數組長度;i++){
		s申請內存;
        s->data=a[i];
        s的左右孩子爲NULL;
	}
}

4.刪除

注意事項:

1.

刪除操做較複雜須要分三中狀況:
(1)刪除節點的左孩子爲空
(2)刪除節點的右孩子爲空
(3)刪除節點有左右子樹ios

2.

函數須要用到&符號,這須要對實參進行刪除。數組

3.

申請空間後刪除記得使用free()。函數

僞代碼:

void DeleteNode(BTree &T, int x){
	if(T爲空){
	    返回;
	}
	尋找元素位置;
	else{
	    if(T->lchild爲空){
	        申請temp;
                T=T->rchild 
                free(temp);
        } 
        else if(T->rchild爲空){
            申請temp:
            temp等於其rchild;
            free(temp);
	}
	else{
            申請temp和其前驅pre;
	    while(temp->rchild){
	        pre=temp;
                temp等於其rchild;
	    }
	    tree->data=temp->data;
	    if(pre!=T){
	        temp的lchild賦值給pre的rchild;
	    }
	    else{
		temp的lchild賦值給pre的lchild;
	    }
        free(temp);
	}       
}

2、完整代碼:

#include<iostream>
using namespace std;
#define length 12							
typedef struct BTNode
{
	int data;
	struct BTNode* lchild, * rchild;
}BTNode, * BTree;
void SearchNode(BTree& T, BTree& s)
{
	if (T == NULL)                     
		return;                             
	if (s->data > T->data)             
	{
		if (T->rchild == NULL) {
			T->rchild = s;
			return;
		}
		SearchNode(T->rchild, s);
	}

	else if (s->data < T->data)
	{
		if (T->lchild == NULL) {
			T->lchild = s;
			return;
		}
		SearchNode(T->lchild, s);
	}
}
void InsertNode(BTree& tree, BTree& s)
{
	if (tree == NULL)
		tree = s;
	else
		SearchNode(tree, s);
}
void CreatBTree(BTree& tree, int* a)
{
	for (int i = 0; i < length; i++)
	{
		BTree s = new BTNode;
		s->data = a[i];
		s->lchild = NULL;
		s->rchild = NULL;
		InsertNode(tree, s);
	}
}
void DeleteNode(BTree& T, int x)			
{
	if (T == NULL)
		return;
	if (x > T->data)
		DeleteNode(T->rchild, x);
	else if (x < T->data)
		DeleteNode(T->lchild, x);
	else
	{
		if (T->lchild == NULL)		
		{
			BTree temp = T;
			T = T->rchild;
			free(temp);
		}
		else if (T->rchild == NULL)			
		{
			BTree temp = T;
			temp = temp->rchild;
			free(temp);
		}
		else
		{
			BTree pre, temp;			
			pre = T;
			temp = T->lchild;
			{
				pre = temp;
				temp = temp->rchild;
			}
			T->data = temp->data;
			if (pre != T)
				pre->rchild = temp->lchild;	
			else
				pre->lchild = temp->lchild;	
			free(temp);
		}
	}
}
void Inorder(BTree tree)
{
	if (tree == NULL)
		return;
	Inorder(tree->lchild);
	cout << tree->data << " ";
	Inorder(tree->rchild);
}
int main()
{
	int n;
	int a[length] = { 50,30,80,20,40,90,10,25,35,85,23,88 };
	BTree tree = NULL;
	CreatBTree(tree, a);
	cout << "中序輸出:"<<endl;
	Inorder(tree);
	cout << endl;
	cout << "需刪除的節點:" << endl;
	cin >> n;
	cout <<"中序輸出:";
	DeleteNode(tree, n);
	Inorder(tree);
	return 0;
}

3、運行截圖


相關文章
相關標籤/搜索