二叉查找树的操作

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Node
{
	int data;
	Node* lc,*rc,*parent;
}*BiTree;
BiTree root;
int a[100];
int n;
void CreateTree(BiTree& T ,int v)        // 注意此处类型,对指针的引用,使得指针不会在返回时有变为空指针
{
	if(!T)
	{
		if(!(T=new Node()))  exit(0);
			T->data=v;
			T->lc=NULL;
			T->rc=NULL;
			T->parent=NULL;
	}
	else
	{
		if(v<T->data)
		{
			CreateTree(T->lc,v);
			T->lc->parent=T;
		}
		else
		{
			CreateTree(T->rc,v);
			T->rc->parent=T;
		}
	}
}

void Built(BiTree&T, int v)       //非递归版本
{
	BiTree cur,p=T;
	while(p)
	{
		if(p->data==v) return;
		cur=p;
		p=(p->data>v)? p->lc:p->rc;
	}
	p=new Node();
	p->data=v;
	p->lc=p->rc=p->parent=NULL;
	if(!T)
		T=p;
	else
	{
		p->parent=cur;
		if(cur->data>v)
			cur->lc=p;
		else
			cur->rc=p;
	}

}

BiTree getMin(BiTree T)
{
	while(T->lc)
		T=T->lc;
    return T;
}

BiTree getMax(BiTree T)
{
	while(T->rc)
		T=T->rc;
	return T;
}

BiTree Successor(BiTree T)         //求后继
{
	if(!T)  return T;
     if(T->rc)                 //右子树不为空,返回右子树最左边的节点
	 {
		 T= getMax(T);
		 return T;
	 }
	 BiTree y=new Node();
	 y=T->parent;
	 while(y&&y->rc==T)      //右子树不为空
	 {
		 T=y;
		 y=y->parent;
	 }
	 return y;
		 
}

BiTree Precessor(BiTree T)         //求前驱节点
{
	if(!T)  return T;
	if(T->lc)                 //左子树不为空,返回左子树最右方的节点
	{
		T= getMin(T);
		return T;
	}
   BiTree y=new Node();      //左子树为空
   y=T->parent;
   while(y&&y->lc==T)
   {
	   T=y;
	   y=y->parent;
   }
  return y;
}

bool DeleteNode(BiTree T)      //当要删除的节点左右节点不为空时,采取的不是删除该节点的方法,而是修改该节点的关键字为其后继节点
{
	if(!T)  return false; 
	BiTree y=new Node();
	BiTree x=new Node();
    y=T;
	if(T->lc&&T->rc)         //当T的左右子树都不为空时,返回的是该点的后继
	    y=Successor(T);
	if(y->lc)                
		x=y->lc;
	else
		x=y->rc;
	if(x)
		x->parent=y->parent;
	if(!(y->parent))         //当要删除的节点为根节点时,令x为根节点
		root=x;
	else
		if(y==y->parent->lc)      //修改,删除后继节点后给其他节点指针带来的变化
			y->parent->lc=x;
		else
			y->parent->rc=x;
	if(y!=T)                    //将要删除节点的域值改为后继节点的
	   T->data=y->data;
	return true;
        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
}

int Print(int v)
{
	printf("%d\n",v);
	return 1;
}

int PostOrderTraverse(BiTree T,int(*visit)(int))
{
	if(T)
	{
		PostOrderTraverse(T->lc,visit);
		PostOrderTraverse(T->rc,visit);
		if(visit(T->data))
			return 1;
		return 0;
	}
	return 1;
}
int main()
{
	n=0;
	int x;
	Node* T=NULL;
	root =new Node();
	root=T;
	while(scanf("%d",&x)!=EOF)
	{
       
	//	CreateTree(T,x);
		Built(T,x);
	}
	BiTree test=new Node();
	test=T;
	test=Successor(T);
	if(test)
		printf("后继是: %d\n",test->data);
	else
		printf("无后继\n");
    test=Precessor(T->lc->lc->rc);
	if(test)
		printf("前驱是: %d\n",test->data);
	else
		printf("无前驱\n");
	if(DeleteNode(T->lc->lc))
		printf("删除成功\n");
	PostOrderTraverse(T,Print);
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值