88.png

    1. /*
    2. 已知二叉树以二叉链表存储,编写算法完成:对于树中每一个元素值为x的结点,删除以它为根的子树,并释放相应的空间
    3. 分析:
    4. 因为我们要删除以寻找到的元素为根的子树,所以我们删除时应采用递归后序遍历进行删除释放,寻找x采用先序遍历
    5. */
    6. struct biTree {
    7. char data;
    8. struct biTree *lchild;
    9. struct biTree *rchild;
    10. };
    11. #define _CRT_SECURE_NO_WARNINGS
    12. #include <stdio.h>
    13. #include <stdlib.h>
    14. void del(biTree *T) {//释放结点函数
    15. if (T) {
    16. if (T->lchild)del(T->lchild);
    17. if (T->rchild)del(T->rchild);
    18. free(T);
    19. }
    20. }
    21. void delXsub(biTree *T, int x) {//这里设置一个父节点指针,因为free只会释放所在节点里面的内容,并不会置空
    22. struct biTree *p = T;
    23. if (p->lchild && p->lchild->data == x) {
    24. del(p->lchild);
    25. p->lchild = NULL;
    26. }
    27. if (p->rchild && p->rchild->data == x) {
    28. del(p->rchild);
    29. p->rchild = NULL;
    30. }
    31. if (p->lchild) delXsub(p->lchild, x);
    32. if (p->rchild) delXsub(p->rchild, x);
    33. }
    34. int main() {
    35. char x;
    36. struct biTree *T = (struct biTree*)malloc(sizeof(struct biTree));
    37. biTree *create(biTree *);
    38. void inOrder(biTree *);
    39. T = create(T);//创建一颗二叉树
    40. printf("请输入要寻找的x值:x=");
    41. scanf("%c", &x);
    42. if (T->data == x) {
    43. del(T);
    44. }
    45. else {
    46. delXsub(T, x);
    47. }
    48. inOrder(T);
    49. return 0;
    50. }