线索二叉树:二叉搜索树转换为双向链表

对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。

 

思路:

采用递归思想,对于二叉搜索树,将左、右子树分别转换为双向链表,左子树转换所得链表的头结点即整个树的头结点,左子树转换所得链表的尾节点与根节点相邻;右子树转换所得链表的尾节点即整个树的尾节点,右子树转换所得链表的头结点与根节点相邻

  1. #include <stdlib.h> 
  2. #include <stdio.h> 
  3.  
  4. typedef struct TNode 
  5.     int value; 
  6.     TNode* lchild; 
  7.     TNode* rchild; 
  8. }TNode,*BTree; 
  9.  
  10. //二叉树转换为双向链表 
  11. TNode* TreeToList(BTree tree,TNode* &lastNode) 
  12.     TNode* head; 
  13.     //若树为空,返回空 
  14.     if (tree == NULL)  
  15.     { 
  16.         lastNode = NULL; 
  17.         return NULL; 
  18.     } 
  19.     //若无左子树,则该根节点为链表的头结点 
  20.     if (tree->lchild==NULL) 
  21.     { 
  22.         head = tree; 
  23.     } 
  24.     //若有左子树,递归调用转换函数将左子树转换为双向链表 
  25.     //左子树转换所得链表的头结点是整个树的头结点 
  26.     //左子树链表的尾结点与根节点相邻 
  27.     else 
  28.     { 
  29.         head = TreeToList(tree->lchild,lastNode); 
  30.         tree->lchild = lastNode; 
  31.         lastNode->rchild = tree; 
  32.     } 
  33.     //若无右子树,则该根节点为链表的尾结点 
  34.     if (tree->rchild==NULL) 
  35.     { 
  36.         lastNode = tree; 
  37.  
  38.     } 
  39.     //若有右子树,递归调用转换函数将左子树转换为双向链表 
  40.     //右子树转换所得链表的尾结点是整个树的尾结点 
  41.     //右子树链表的头结点与根节点相邻 
  42.     else 
  43.     { 
  44.         tree->rchild = TreeToList(tree->rchild,lastNode); 
  45.         tree->rchild->lchild = tree; 
  46.     } 
  47.     return head; 
  48.  
  49. int main() 
  50.     BTree tree = (BTree)malloc(sizeof(TNode)); 
  51.     tree->value = 4; 
  52.     tree->lchild = (TNode*)malloc(sizeof(TNode)); 
  53.     tree->lchild->value = 2; 
  54.     tree->lchild->lchild = (TNode*)malloc(sizeof(TNode)); 
  55.     tree->lchild->lchild->value = 1; 
  56.     tree->lchild->lchild->lchild = NULL; 
  57.     tree->lchild->lchild->rchild = NULL; 
  58.     tree->lchild->rchild = (TNode*)malloc(sizeof(TNode)); 
  59.     tree->lchild->rchild->value = 3; 
  60.     tree->lchild->rchild->lchild = NULL; 
  61.     tree->lchild->rchild->rchild = NULL; 
  62.     tree->rchild = (TNode*)malloc(sizeof(TNode)); 
  63.     tree->rchild->value = 6; 
  64.     tree->rchild->lchild = (TNode*)malloc(sizeof(TNode)); 
  65.     tree->rchild->lchild->value = 5; 
  66.     tree->rchild->lchild->lchild = NULL; 
  67.     tree->rchild->lchild->rchild = NULL; 
  68.     tree->rchild->rchild = NULL; 
  69.      
  70.     TNode* lastNode; 
  71.     TNode* listHead = TreeToList(tree,lastNode); 
  72.     TNode* node = listHead; 
  73.     while(node) 
  74.     { 
  75.         printf("%d ",node->value); 
  76.         node = node->rchild; 
  77.     } 
  78.     printf("\n"); 
  79.  
  80.     return 0; 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值