java二叉树的增删改查原理,二叉树实现增删改查

#include

#include

using namespace std;

//*************************

struct BSTree{

int value;

BSTree* bsLeft;

BSTree* bsRight;

};

//*************************

void printBSTree(BSTree* p);

BSTree* deleteNode(BSTree* p, int value);

int main()

{

int inputNum = 0;

//head pointer is fixed

//p pointer is scanning

BSTree* head = NULL;

BSTree* p = NULL;

//input -1 ends input

//scanf("%d",&inputNum);

cin>>inputNum;

while(inputNum!=-1){

BSTree* temp = new BSTree();

temp->value = inputNum;

temp->bsLeft = NULL;

temp->bsRight = NULL;

if(head == NULL){

head = temp;

}else{

p = head;

while(true){

if(temp->value <

p->value){

if(p->bsLeft == NULL){

p->bsLeft = temp;

break;

}

p = p->bsLeft;

}

if(temp->value >=

p->value){

if(p->bsRight == NULL){

p->bsRight = temp;

break;

}

p = p->bsRight;

}

}

}

cin>>inputNum;

//scanf("%d",&inputNum);

}

//read the BSTree

printBSTree(head);

cout<

cin>>inputNum;

while(inputNum!=-1){

head = deleteNode(head,inputNum);

if(head == NULL){

cout<

null!!";

break;

}

printBSTree(head);

cout<

cin>>inputNum;

}

return 0;

}

void printBSTree(BSTree* p)

{

if(p == NULL)

return;

BSTree* left = p->bsLeft;

BSTree* right = p->bsRight;

printBSTree(left);

printf("%d  ",

p->value);

printBSTree(right);

return;

}

BSTree* deleteNode(BSTree* head, int value)

{

//循环遍历找到该值

BSTree* parent = head;

BSTree* p = head;

while(p != NULL){

if(value < p->value ){

parent = p;

p = p->bsLeft;

}

else if(value > p->value){

parent = p;

p = p->bsRight;

}

else

break;

}

if(p == NULL){

cout<

find!!"<

}

//如果都为空

if(p->bsRight==NULL

&&

p->bsLeft==NULL){

if(p==head){

delete p;

return NULL;

}

if(parent->bsLeft == p)

parent->bsLeft = NULL;

else if(parent->bsRight == p)

parent->bsRight = NULL;

delete p;

}

//如果有右子树

if(p->bsRight!=NULL){

BSTree* temp = p->bsRight;

BSTree* tempParent = p->bsRight;

while(temp->bsLeft!=NULL){

tempParent = temp;

temp = temp->bsLeft;

}

if(parent->bsLeft == p)

parent->bsLeft = temp;

else if(parent->bsRight == p)

parent->bsRight = temp;

if(temp!=tempParent){

tempParent->bsLeft =

temp->bsRight;

temp->bsLeft = p->bsLeft;

temp->bsRight =

p->bsRight;

}else{

temp->bsLeft = p->bsLeft;

}

if(head == p){

delete p;

return temp;

}

delete p;

}

//如果没有右子树

if(p->bsLeft!=NULL

&&

p->bsRight==NULL){

if(parent->bsLeft == p)

parent->bsLeft =

p->bsLeft;

else if(parent->bsRight == p)

parent->bsRight =

p->bsLeft;

if(p == head){

BSTree* temp = p->bsLeft;

delete p;

return temp;

}

delete p;

}

return head;

}

BSTree* searchNode(BSTree* head, int value, int

isParent)

{

BSTree* parent = head;

BSTree* p = head;

while(p != NULL){

if(value < p->value ){

parent = p;

p = p->bsLeft;

}

else if(value > p->value){

parent = p;

p = p->bsRight;

}

else{

if(isParent == 0)

return p;

else

return parent;

}

}

return head;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值