• 试编写算法(用C语言)打印值为x的结点的所有祖先,假设值为x的结点不多于一个。(递归实现和非递归实现)


    (一)递归实现:

    完整代码: 

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. #define MaxSize 100
    6. typedef int ElemType;
    7. typedef struct BiNode {
    8. ElemType data;
    9. BiNode* lchild;
    10. BiNode* rchild;
    11. }BiNode, * BiTree;
    12. //构建二叉树
    13. BiNode* Create(BiNode* bt) {
    14. static int i = 0;
    15. char ch;
    16. //string str = "AB#D##C##";
    17. //string str = "124##56##7##3##";
    18. //string str = "ABD#G##E##CF###";
    19. string str = "ABD#GH##I##E##CF###";
    20. ch = str[i++];
    21. if (ch == '#')bt = NULL;//建立一棵空树
    22. else {
    23. bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
    24. bt->lchild = Create(bt->lchild);//递归建立左子树
    25. bt->rchild = Create(bt->rchild);//递归建立右子树
    26. }
    27. return bt;
    28. }
    29. typedef struct {
    30. ElemType data[MaxSize];//存放栈中元素
    31. int top;//栈顶指针
    32. }SqStack;
    33. //(1)初始化
    34. void InitStack(SqStack& S) {
    35. S.top = -1;//初始化栈顶指针
    36. }
    37. //(2)判栈空
    38. bool IsEmpty(SqStack& S) {
    39. if (S.top == -1) {//栈空
    40. return true;
    41. }
    42. else {//不空
    43. return false;
    44. }
    45. }
    46. //(3)进栈
    47. bool Push(SqStack& S, ElemType data) {
    48. if (S.top == MaxSize - 1) {//栈满,报错
    49. return false;
    50. }
    51. S.data[++S.top] = data;//指针先加1,再加入栈
    52. return true;
    53. }
    54. //(4)出栈
    55. bool Pop(SqStack& S, ElemType &data) {
    56. if (S.top == -1) {//栈空,报错
    57. return false;
    58. }
    59. data = S.data[S.top--];//先出栈,指针再减1
    60. return true;
    61. }
    62. //(5)读栈顶元素
    63. bool GetTop(SqStack& S, ElemType data) {
    64. if (S.top == -1) {//栈空,报错
    65. return false;
    66. }
    67. data = S.data[S.top];//先出栈,指针再减1
    68. return true;
    69. }
    70. bool Ancestors(BiNode* root,ElemType x, SqStack &S) {
    71. if (!root) return false;
    72. if (root->data == x) return true;
    73. if (Ancestors(root->lchild, x,S) || Ancestors(root->rchild, x, S)) {
    74. //printf("%c ", root->data);//G D B A
    75. Push(S, root->data);
    76. return true;
    77. }
    78. return false;
    79. }
    80. int main() {
    81. //创建一棵二叉树
    82. BiTree T = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
    83. T = Create(T);
    84. SqStack S;
    85. InitStack(S);
    86. Ancestors(T, 'I',S);
    87. ElemType ch;
    88. while (!IsEmpty(S)) {
    89. Pop(S, ch);
    90. printf("%c ", ch); // A B D G
    91. }
    92. }

     

     (二)非递归实现:

    因为查找的过程就是后序遍历的过程,因此使用的栈的深度不超过树的深度

    完整的代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. #define MaxSize 100
    6. typedef char ElemType;
    7. typedef struct BiNode {
    8. ElemType data;
    9. BiNode* lchild;
    10. BiNode* rchild;
    11. }BiNode, * BiTree;
    12. //构建二叉树
    13. BiNode* Create(BiNode* bt) {
    14. static int i = 0;
    15. char ch;
    16. //string str = "AB#D##C##";
    17. //string str = "124##56##7##3##";
    18. //string str = "ABD#G##E##CF###";
    19. string str = "ABD#GH##I##E##CF###";
    20. ch = str[i++];
    21. if (ch == '#')bt = NULL;//建立一棵空树
    22. else {
    23. bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
    24. bt->lchild = Create(bt->lchild);//递归建立左子树
    25. bt->rchild = Create(bt->rchild);//递归建立右子树
    26. }
    27. return bt;
    28. }
    29. //算法思想:采用非递归后序遍历,最后访问根结点,访问到值为x的结点时,栈
    30. //中所有元素均为该结点的祖先,依次出栈打印即可。算法实现如下:
    31. typedef struct {
    32. BiTree t;
    33. int tag;
    34. }stack;//tag = 0 表示左子女被访问,tag = 1表示右子女被访问
    35. bool Search(BiTree bt,ElemType x) {
    36. //在二叉树bt中,查找值为x的结点,并打印其所有祖先
    37. stack s[MaxSize];
    38. int top = 0;
    39. while (bt != NULL || top > 0) {
    40. while (bt != NULL && bt->data != x) {//结点入栈
    41. s[++top].t = bt;
    42. s[top].tag = 0;
    43. bt = bt->lchild;//沿左分支向下
    44. }
    45. if (bt != NULL && bt->data == x) {
    46. printf("所查结点的所有祖先结点的值为:\n");//找到x
    47. for (int i = 1; i <= top; i++) {
    48. printf("%c ",s[i].t->data);//输出祖先值后结束
    49. }
    50. exit(1);
    51. }
    52. while (top != 0 && s[top].tag == 1)
    53. top--;//退栈(空遍历)
    54. if (top != 0) {
    55. s[top].tag = 1;
    56. bt = s[top].t->rchild;//沿右分支向下遍历
    57. }
    58. }
    59. }
    60. int main() {
    61. //创建一棵二叉树
    62. BiTree bt = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
    63. bt = Create(bt);
    64. Search(bt, 'I');
    65. }

     

  • 相关阅读:
    优思学院|八大浪费深度剖析
    大数据之hadoop伪分布集群搭建简要概述
    vue学习之事件绑定
    R语言数据分析案例
    【Django】REST_Framework框架——GenericAPIView类源码解析
    RabbitMQ_Windows系统下安装RabbitMQ详细教程
    windows安装向量数据库milvus
    大数据智能分析(BI)平台设计1---基本概念
    基因调控网络及其模型
    【机器学习】评价指标 : 准确率,查准率与查全率
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/128139807