#include<stdio.h>
#include<stdlib.h>
struct TreeNode{
int data;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode *findMin(struct TreeNode *T){
if(T==NULL){
return NULL;
}
if(T->left==NULL){/*对于有序二叉树最左边的节点值最小*/
return T;
}
return findMin(T->left);
}
struct TreeNode *deleteNode(struct TreeNode *T,int num){/*删除操作的核心代码*/
if(T==NULL){
return NULL;
}
if(T->data>num){
T->left=deleteNode(T->left,num);
}else if(T->data<num){
T->right=deleteNode(T->right,num);
}else if(T->left!=NULL&&T->right!=NULL){
struct TreeNode *min=findMin(T);
T->data=min->data;/*左右都不空就到找到右边最小节点,替换该节点*/
T->right=deleteNode(T->right,min->data);/*然后在右子树中删除该最小节点*/
}else{
struct TreeNode *temp;
temp=T;
if(T->left==NULL){/*左空接右边*/
T=T->right;
}else if(T->right==NULL){/*右空接左边*/
T=T->left;
}
free(temp);
}
return T;
}
struct TreeNode *createNode(int num){/*创建新的树节点*/
struct TreeNode *T;
T=(struct TreeNode *)malloc(sizeof(struct TreeNode));
T->data=num;
T->left=NULL;
T->right=NULL;
return T;
}
struct TreeNode *add(struct TreeNode *T,int num){/*向树中加元素*/
if(T==NULL){
return createNode(num);
}
if(num<T->data){
T->left=add(T->left,num);
}else if(num>T->data){
T->right=add(T->right,num);
}
/*剩余一种情况为num和T->data相等,不作处理,这里构造的是没有重复元素的二叉树*/
return T;
}
void PreOrder(struct TreeNode *T){/*前序遍历*/
if(T!=NULL){
printf("\t%d",T->data);
PreOrder(T->left);
PreOrder(T->right);
}
}
void InOrder(struct TreeNode *T){/*中序遍历*/
if(T!=NULL){
InOrder(T->left);
printf("\t%d",T->data);
InOrder(T->right);
}
}
void PostOrder(struct TreeNode *T){/*后序遍历*/
if(T!=NULL){
PostOrder(T->left);
PostOrder(T->right);
printf("\t%d",T->data);
}
}
int main(){
struct TreeNode *T;
T=NULL;
for(int i=0;i<12;i++){
T=add(T,i);
}
printf("前序遍历:\n");
PreOrder(T);
printf("\n中序遍历:\n");
InOrder(T);
printf("\n后序遍历:\n");
PostOrder(T);
T=deleteNode(T,3);
T=deleteNode(T,5);
printf("\n删除节点值为3,5后的二叉树:");
printf("\n前序遍历:\n");
PreOrder(T);
printf("\n中序遍历:\n");
InOrder(T);
printf("\n后序遍历:\n");
PostOrder(T);
return 0;
}
给定值删除二叉树中的节点(C语言)
最新推荐文章于 2023-05-15 19:05:37 发布