#include
#include
//二叉树的生成和释放
typedef struct Node
{int data;struct Node * pParent;struct Node * pLeftChild;struct Node * pRightChild;
}Node;Node * Create_BTree(int *array,Node* pParent=NULL)//二叉排序树的创建,按照先序遍历的方法进行构造
{static int i=0;if (array[i]==0){return NULL;}Node *temp=(Node *)malloc(sizeof(Node));temp->data=array[i];temp->pParent=pParent;i++;temp->pLeftChild=Create_BTree(array,temp);i++;temp->pRightChild=Create_BTree(array,temp);return temp;
}
void Mid_Order(Node* tree)//二叉排序树的中序遍历
{if (tree==NULL){return;}Mid_Order(tree->pLeftChild);cout<data<<" ";Mid_Order(tree->pRightChild);
}
void Destroy_BTree(Node* tree)//二叉排序树的是否
{if (tree==NULL){return;}Destroy_BTree(tree->pLeftChild);Destroy_BTree(tree->pRightChild);free(tree);
}
Node* Tree_Search(Node* tree,int x)//二叉排序树的查找
{Node* temp=tree;while(temp){if(temp->data==x)break;else if(temp->data>x)temp=temp->pLeftChild;elsetemp=temp->pRightChild;}return temp;
}
Node * Tree_Minimum(Node* tree)//二叉排序树的最小节点
{while(tree&&tree->pLeftChild){tree=tree->pLeftChild;}return tree;
}
Node * Tree_Maximum(Node* tree)//二叉排序树的最大节点
{while(tree&&tree->pRightChild){tree=tree->pRightChild;}return tree;
}
Node * Tree_Successor(Node *p)//返回节点p的后继//中序遍历
{if(p==NULL)return p;else if(p->pRightChild)return Tree_Minimum(p->pRightChild);else{while(p->pParent&&p->pParent->pRightChild==p)p=p->pParent;return p->pParent;}}
Node *Tree_PreDecessor(Node* p)//中序遍历 求p的前驱节点
{if (p==NULL)return p;else if(p->pLeftChild)return Tree_Maximum(p->pLeftChild);else{while(p->pParent&&p->pParent->pLeftChild==p)p=p->pParent;return p->pParent;}
}
void Tree_Insert(Node* &tree,int x)//给二叉排序树插入新节点
{Node * pNodeNew=(Node*)malloc(sizeof(Node));pNodeNew->pLeftChild=NULL;pNodeNew->pRightChild=NULL;pNodeNew->data=x;if(tree==NULL){pNodeNew->pParent=NULL;tree=pNodeNew;return;}Node * pTempParent=NULL,*pTemp=tree;while(pTemp){pTempParent=pTemp;if (pTemp->data<x){pTemp=pTemp->pRightChild;} else{pTemp=pTemp->pLeftChild;}}pNodeNew->pParent=pTempParent;if (pTempParent->data<x){pTempParent->pRightChild=pNodeNew;}elsepTempParent->pLeftChild=pNodeNew;
}
void Tree_Delete(Node* &tree,Node *p)//删除二叉排序树中一个节点
{if(p->pLeftChild==NULL&&p->pRightChild==NULL)//删除叶节点
{Node *pParent=p->pParent;if (pParent){if (pParent->datadata){pParent->pRightChild=NULL;}elsepParent->pLeftChild=NULL;free(p);} else{tree=NULL;free(p);}}else if (p->pLeftChild&&p->pRightChild==NULL||p->pRightChild&&p->pLeftChild==NULL)//只有一个子树
{Node *pParent=p->pParent;if (pParent){if (pParent->datadata)//子树连到父节点的右孩子
{if(p->pLeftChild)//哪个子树不为空连哪个
{pParent->pRightChild=p->pLeftChild;p->pLeftChild->pParent=pParent;}else{pParent->pRightChild=p->pRightChild;p->pRightChild->pParent=pParent;}free(p);}else{if(p->pLeftChild)//哪个子树不为空连哪个
{pParent->pLeftChild=p->pLeftChild;p->pLeftChild->pParent=pParent;}else{pParent->pLeftChild=p->pRightChild;p->pRightChild->pParent=pParent;}free(p); }} else{if(p->pLeftChild){p->pLeftChild->pParent=NULL;tree=p->pLeftChild;}else{p->pRightChild->pParent=NULL;tree=p->pRightChild;}free(p);}}else//有两个子树
{Node *temp=Tree_Maximum(p->pLeftChild);int x=p->data;p->data=temp->data;temp->data=x;Tree_Delete(tree,temp);}
}
void main()
{int array[]={ 15,6,3,2,0,0,4,0,0,7,0,13,9,0,0,0,18,17,0,0,20,0,0};Node *tree=Create_BTree(array);Tree_Insert(tree,21);Mid_Order(tree);cout<<endl;Node *temp=Tree_Search(tree,7);//查找
Tree_Delete(tree,temp);Mid_Order(tree);cout<<endl;Destroy_BTree(tree);
}