算法思想:按照先序遍历的思想,查找值为x的结点,若找到,则按照后序遍历的思想进行删除,先删除他的左子树,再删除他的右子树,最后删除根节点,并将根节点指针置为空。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max_size 100
typedef char ElemType;
typedef struct BiTNode {
ElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void preOrder(BiTree T) {
if (T != NULL) {
printf("%c", T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(BiTree T) {
if (T != NULL) {
inOrder(T->lchild);
printf("%c", T->data);
inOrder(T->rchild);
}
}
BiTree creatBiTree(ElemType* preOrderNode, int preFirstNode, int preLastNode, ElemType* inOrderNode, int inFirstNode, int inLastNode) {
if (preFirstNode > preLastNode) {
return NULL;
}
BiTNode* pnode = (BiTNode*)malloc(sizeof(BiTNode));
pnode->data = preOrderNode[preFirstNode];
pnode->lchild = pnode->rchild = NULL;
int index;
for (index = inFirstNode; index <= inLastNode; index++) {
if (inOrderNode[index] == pnode->data) {
break;
}
}
pnode->lchild = creatBiTree(preOrderNode, preFirstNode + 1, preFirstNode + index - inFirstNode, inOrderNode, inFirstNode, index - 1);
pnode->rchild = creatBiTree(preOrderNode, preFirstNode + index - inFirstNode + 1, preLastNode, inOrderNode, index + 1, inLastNode);
return pnode;
}
//后序遍历以该结点为根的子树
void destroy(BiTree & T) {
if (T != NULL) {
destroy(T->lchild);//销毁左子树
destroy(T->rchild);//销毁右子树
free(T);//销毁根节点
T = NULL;//根节点指针置为空
}
}
//先序遍历查找值为x的结点并进行删除
void FindNode(BiTree& T, ElemType x)
{
if (T == NULL)
return;
if (T->data == x)//如果发现该结点为所要销毁的结点
{
destroy(T);//销毁它
return;
}
FindNode(T->lchild, x);//看左子树是否存在要被销毁的结点
FindNode(T->rchild, x);//看右子树是否存在要被销毁的结点
}
int main() {
ElemType preOrderNode[max_size] = { 0 };
ElemType inOrderNode[max_size] = { 0 };
int preOrderLength = 0;
int inOrderLength = 0;
gets_s(preOrderNode);
gets_s(inOrderNode);
preOrderLength = strlen(preOrderNode);
inOrderLength = strlen(inOrderNode);
BiTree T = creatBiTree(preOrderNode, 0, preOrderLength - 1, inOrderNode, 0, inOrderLength - 1);
ElemType x;
scanf("%c", &x);
findnode(T, x);
preOrder(T);
printf("\n");
inOrder(T);
printf("\n");
return 0;
}