鱼C论坛

 找回密码
 立即注册
查看: 2985|回复: 2

虚心请教,对于线索二叉树的一些问题

[复制链接]
发表于 2020-3-2 06:32:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题为:

不知道怎么把线索为1的前后驱元素的地址放在对应的指针区域中

例如下面的二叉树:

                        A
                B                E
         C          D                        F


就是不知道怎么把C的后驱元素的地址指针指向B   D的前驱元素指向B  后驱指向A  。。。。

希望能有大佬可以完善一下代码,或者讲一下方法,我再去琢磨一下





  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef char TYPE;

  4. //线索为0为孩子节点
  5. //线索为1为前后驱线索
  6. typedef struct tree
  7. {

  8.         struct tree *left;
  9.         char clue_left;//左
  10.         TYPE data;
  11.         char clue_right;//右
  12.         struct tree *right;

  13. }clue_pot,*tree;

  14. inclute_tree(tree *p)
  15. {
  16.         char c;
  17.         scanf("%c",&c);
  18.         if(c==' ')
  19.         {
  20.                 *p = NULL;
  21.         }
  22.         else
  23.         {

  24.         *p = (clue_pot *)malloc(sizeof(clue_pot));
  25.         (*p)->data = c;
  26.                 (*p)->clue_left = '0';
  27.                 (*p)->clue_right = '0';
  28.         inclute_tree(&(*p)->left);
  29.         inclute_tree(&(*p)->right);
  30.         }
  31. }


  32. change_tree(clue_pot *head)
  33. {
  34.        
  35.         if( head != NULL)
  36.         {

  37.                 if(change_tree(head->left)==1)
  38.                 {
  39.                        

  40.                         head->clue_left='1';


  41.                 }
  42.        


  43.                 if(change_tree(head->right)==1)
  44.                 {
  45.                         head->clue_right='1';
  46.                         head->right = pre->left;
  47.                 }
  48.                
  49.         }
  50.         else
  51.         {
  52.                 return 1;
  53.         }
  54. }

  55. check_tree(tree root,int numb)
  56. {
  57.     if(root != NULL)
  58.     {
  59.         printf("%c在第%d层\n",root->data,numb);
  60.         printf("左线索:%c,左边指针地址:%p,本身地址:%p,右线索:%c,右边指针地址:%p\n",root->clue_left,root->left,root,root->clue_right,root->right);
  61.         check_tree(root->left,numb+1);
  62.         check_tree(root->right,numb+1);
  63.     }
  64. }

  65. int main()
  66. {
  67.         tree test=NULL;
  68.         inclute_tree(&test);
  69.         change_tree(test);
  70.         check_tree(test,1);
  71.         return 0;

  72. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 06:33:45 | 显示全部楼层
琢磨一晚上了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-2 09:30:24 | 显示全部楼层
自己琢磨出来了,代码分享一下,做了挺多注释的

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef char TYPE;

  4. //线索为0为孩子节点
  5. //线索为1为前后驱线索
  6. typedef struct tree
  7. {

  8.         struct tree *left;//存放左下节点的地址
  9.         char clue_left;//如果左下还有节点,值为0,代表当前为左下的父节点,left存放的为下一个节点地址;如果左下为空,值为1。当值为1时候按中序排序left存放上一个节点地址
  10.         TYPE data;//储存节点存放的信息
  11.         char clue_right;//如果右下还有节点,值为0,代表当前为右下的父节点,left存放的为下一个节点地址;如果左下为空,值为1。当值为1时候按中序排序left存放上一个节点地址
  12.         struct tree *right;//存放右下节点的地址

  13. }clue_pot,*tree;//定义一个树的节点;定义一个指向树的节点的指针


  14. //初始化二叉树,递归方法
  15. //用前序输入  空格代表没有下一个节点
  16. inclute_tree(tree *p)
  17. {
  18.         char c;
  19.         scanf("%c",&c);
  20.         if(c==' ')
  21.         {
  22.                 *p = NULL;
  23.         }
  24.         else
  25.         {

  26.         *p = (clue_pot *)malloc(sizeof(clue_pot));
  27.         (*p)->data = c;
  28.                 (*p)->clue_left = '0';
  29.                 (*p)->clue_right = '0';
  30.         inclute_tree(&(*p)->left);
  31.         inclute_tree(&(*p)->right);
  32.         }
  33. }

  34. tree pre; //定义一个全局变量(指向二叉树节点的指针类型)
  35. //如果线索为0的话 在叶子层的左右指针要按 中序排序 指回上一个节点,此时pre的作用就来了
  36. //作用:用于递归到最后一层时把最后一层节点赋值到这,结束后回到上一层时,此时操作这个变量(最后一层节点)的右节点指针指向当前节点(从最后一层回退)的地址


  37. tree two;

  38. change_tree(clue_pot *head)
  39. {

  40.         if( head != NULL)
  41.         {
  42.                 //首先递归到最左下角的树节点
  43.                 if(change_tree(head->left)==1)
  44.                 {               
  45.                         head->clue_left='1';
  46.                         head->left = pre;
  47.                 }

  48.                 if(pre->right==NULL)
  49.                 {
  50.                         pre->right = head;
  51.                         pre = head;
  52.                 }
  53.                 pre = head;
  54.                 if(change_tree(head->right)==1)
  55.                 {
  56.                         head->clue_right='1';
  57.                 }
  58.         }
  59.         else
  60.         {
  61.                 return 1;
  62.         }
  63. }

  64. check_tree(tree root,int numb)
  65. {
  66.     if(root != NULL)
  67.     {
  68.                
  69.         printf("%c在第%d层\n",root->data,numb);
  70.                 printf("左线索:%c,左边指针地址:%p,本身地址:%p,右线索:%c,右边指针地址:%p\n",root->clue_left,root->left,root,root->clue_right,root->right);
  71.                 if(root->clue_left=='1'&&root->clue_right=='1')
  72.                         return 0;
  73.                 getchar();
  74.         check_tree(root->left,numb+1);
  75.         check_tree(root->right,numb+1);
  76.     }
  77. }


  78. //迭代查询二叉树
  79. //打印则为按照中序排序的顺序进行打印
  80. check_tree2(tree root,tree end)
  81. {
  82.         while(root->left != end)
  83.         {
  84.                 root = root->left;
  85.         }
  86.        
  87.         //循环出来  root 为左边最末的节点

  88.         while(root != NULL)
  89.         {
  90.                 printf("左线索:%c,左边指针地址:%p,本身地址:%p,data内容:%c,右线索:%c,右边指针地址:%p\n",root->clue_left,root->left,root,root->data,root->clue_right,root->right);
  91.                 root = root->right;
  92.         }
  93. }




  94. int main()
  95. {
  96.         tree test=NULL;
  97.         inclute_tree(&test);
  98.         two = (clue_pot *)malloc(sizeof(clue_pot));
  99.         two->left = test;
  100.         two->right = two;
  101.         two->clue_right='0';
  102.         pre = two;
  103.         change_tree(test);
  104.         pre->left = two;
  105.         check_tree2(test,two);
  106.         return 0;

  107. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 12:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表