当前位置:   article > 正文

二叉树插入和删除操作的递归实现(c语言)_二叉树删除节点怎么用c语言写纯递归

二叉树删除节点怎么用c语言写纯递归

链表和数组是最常见的数据结构,对于数据结构来说,查找(Find),最大最小值(FindMinFindMax),插入(Insert)和删除(Delete)操作是最基本的操作。对于链表和数组来说,这些操作的时间界为ON),其中N为元素的个数。数组的插入和删除需要对其他一些元素进行额外的移动操作,链表的查询操作是按顺序进行的,元素比较多的时候遍历操作需要花很多的时间。

直观上来讲,数组和链表都是线性结构,而二叉树每个节点的基本元素有三个,即关键字(Element),左孩子(Left)和右孩子(Right),整体上呈现分支结构,这样每个结构的长度就缩短了。因为二叉树有一个基本性质,即对每个节点来说,其左子树的所有节点关键字不大于该节点的关键字大小,其右子树的所有节点的关键字不小于该节点的关键字大小,所以使得对二叉树数据结构的基本操作都是沿分支路径进行的(它的结构使得这一操作是正确的),操作时间大大减少。可以证明,如果一棵二叉树的树高为h,则上述操作的时间界是Oh)。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #ifndef _Tree_H
  4. struct TreeNode;
  5. typedef struct TreeNode *Position;
  6. typedef struct TreeNode *SearchTree;
  7. SearchTree MakeEmpty(SearchTree T);
  8. Position Find(int X, SearchTree T);
  9. Position FindMin(SearchTree T);
  10. Position FindMax(SearchTree T);
  11. SearchTree Insert(int X, SearchTree T);
  12. SearchTree Delete(int X, SearchTree T);
  13. #endif /*_Tree_H*/
  14. struct TreeNode
  15. {
  16. int Element;
  17. SearchTree Left;
  18. SearchTree Right;
  19. };
  20. /*把一棵树清空*/
  21. SearchTree
  22. MakeEmpty(SearchTree T)
  23. {
  24. if (T != NULL)
  25. {
  26. MakeEmpty(T->Left);
  27. MakeEmpty(T->Right);
  28. free(T);
  29. }
  30. return NULL;
  31. }
  32. /*查找操作*/
  33. /*方法:从根节点开始,将欲查找的元素X与节点关键字作比较,如果比X小,则沿该节点右子树进行查找,
  34. 如果比X大,则沿该节点左子树进行查找*/
  35. Position
  36. Find(int X, SearchTree T)
  37. {
  38. if (T == NULL)
  39. return NULL;
  40. if (X < T->Element)
  41. return Find(X, T->Left);
  42. else
  43. if (X>T->Element)
  44. return Find(X, T->Right);
  45. else
  46. return T;
  47. }
  48. /*查找最小元素*/
  49. /*方法:从根节点开始,沿左子树进行寻访,直到找到最左分支路径上最深的节点*/
  50. Position
  51. FindMin(SearchTree T)
  52. {
  53. if (T == NULL)
  54. return NULL;
  55. else
  56. if (T->Left == NULL)//最左分支路径上的最后一点节点;
  57. return T;
  58. else
  59. return FindMin(T->Left);//对于不满足条件的节点,沿其左子树进行寻访;
  60. }
  61. /*查找最大元素*/
  62. /*方法:从根节点开始,沿右子树进行寻访,直到找到最右分支路径上最深的节点*/
  63. /*对于Insert(X,T)函数来说,只有形参T==NULL时,返回值发生变化,否则每次递归结束,
  64. 返回值都和形参相等,此时T->Left/Right=Insert()不改变树的结构。*/
  65. Position
  66. FindMax(SearchTree T)
  67. {
  68. if (T == NULL)
  69. return NULL;
  70. else
  71. if (T->Right == NULL)//最右分支路径上的最后一个节点;
  72. return T;
  73. else
  74. return FindMax(T->Right);//对于不满足条件的节点,沿其右子树进行寻访;
  75. }
  76. /*插入操作*/
  77. /*方法:从根节点开始,通过将待插入元素X与节点元素进行比较,把X插入到寻访路径的最后一个节点上*/
  78. SearchTree
  79. Insert(int X, SearchTree T)
  80. {
  81. if (X < T->Element)
  82. T->Left = Insert(X, T->Left);
  83. else
  84. if (X>T->Element)
  85. T->Right = Insert(X, T->Right);/*沿路径进行寻访,直到找到能够插入待插入元素的位置节点T1。T1表示路径上的最后一个节点,
  86. X或是其左孩子,或是其右孩子。当T==NULL时,Insert新建立一个叶节点T1,将关键字X存入其中。
  87. 然后Insert函数执行完毕,返回新节点T1,由于递归结束,所以跳转到前一级递归程序代码
  88. T1->Left/Right=Insert()处继续执行,将T2放到T1的正确位置上,同时当前递归也结束,再退
  89. 回到上一级递归处继续执行,以后的递归处执行的语句都不改变树的结构。*/
  90. else
  91. if (T==NULL) //将元素X放到新的节点中;
  92. {
  93. T = (SearchTree)malloc(sizeof(struct TreeNode));
  94. if (T == NULL)
  95. printf("Out of space!!!");
  96. else
  97. {
  98. T->Element = X;
  99. T->Left = T->Right = NULL;
  100. }
  101. }
  102. return T;
  103. }
  104. /*删除操作*/
  105. /*方法:先找到要删除的元素X所在的节点,然后按照该节点T的结构分成三种情况:
  106. case1:T为叶节点。处理方法:直接将T删除即可,把T置为NULL;
  107. case2:T有且仅有一个子树。处理方法:将T删除,然后将其子树移到T的位置;
  108. case3:T有两个子树。处理方法:先找到X的后继Y(Y一定在T的右子树中),然
  109. 后将T与Y交换,最后把Y删除。*/
  110. SearchTree
  111. Delete(int X, SearchTree T)
  112. {
  113. Position TmpCell;
  114. if (T == NULL)
  115. printf("Element not find!!!");
  116. else
  117. if (X<T->Element)
  118. T->Left = Delete(X, T->Left);
  119. else
  120. if (X>T->Element)
  121. T->Right = Delete(X, T->Right);//沿路径对删除元素X进行寻访;
  122. else
  123. if (T->Left&&T->Right) //case3
  124. {
  125. TmpCell = FindMin(T->Right); //寻找T的后继Y;
  126. T->Element = TmpCell->Element;//交换T和Y;
  127. T->Right = Delete(T->Element, T->Right);//删除后继Y;
  128. }
  129. else //case1和case2;
  130. {
  131. TmpCell = T;
  132. if (T->Left == NULL)
  133. T = T->Right;
  134. else if (T->Right == NULL)
  135. T = T->Left;
  136. free(TmpCell);
  137. }
  138. return T;
  139. }


本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号