C -- 线索二叉树

线索二叉树什么是线索二叉树?简单点说就是,线索化后的二叉树。线索是指结点中指向前驱和后继的指针。二叉树即,先前提到过的二叉树,若二叉树中的结点存在空指针域,则我们可以利用此空域作为线索。那如何在二叉树的基础上构建线索二叉树?即利用基本二叉树中的空指针域,避免浪费,用来指示前驱或者后继结点,这个过程即线索化。那问题来了当我们遍历这种线索化后的二叉树的时候,怎么知道当前节点的指针域是子树域还是线...
摘要由CSDN通过智能技术生成

线索二叉树

什么是线索二叉树?简单点说就是,线索化后的二叉树。线索是指结点中指向前驱和后继的指针。二叉树即,先前提到过的二叉树,若二叉树中的结点存在空指针域,则我们可以利用此空域作为线索。那如何在二叉树的基础上构建线索二叉树?即利用基本二叉树中的空指针域,避免浪费,用来指示前驱或者后继结点,这个过程即线索化。

那问题来了

当我们遍历这种线索化后的二叉树的时候,怎么知道当前节点的指针域是子树域还是线索域呢(也就是说当前节点的指针域到底是指向子树,还是指向前驱或者后继呢?)此时,就需要在基础二叉树节点上添加标志域以解释当前指针域(即区分指针所指是孩子还是线索

先来看二叉树节点定义

lchild data rchild
指示左孩子 数据域 指示右孩子
typedef struct _BTNode{
   
	ElemType data;
	struct _BTNode * lchild;	//指示左孩子
	struct _BTNOde * rchild;	//指示右孩子
}BTNode;
这是关于二叉树用二叉链表实现的节点的定义,不做过多讨论,有兴趣的可以去看我的一篇关于二叉树基本操作递归非递归简单实现的文章。此处主要与线索二叉树节点做对比。

再看线索二叉树节点定义

lchild LTag data RTag rchild
指示左孩子/指示节点前驱 0/1 数据域 0/1 指示右孩子/指示节点后继

LTag = 0,表示lchild域指向左孩子;
LTag = 1,表示lchild域指向节点前驱;

同理

RTag = 0,表示rchild域指向右孩子;
RTag = 1,表示rchild域指向节点后继;

与单纯的二叉树节点的定义的区别就是增加了一个Tag域以区分rchild域和lchild域的作用。也可以看成是这两个指针域功能被重载了,用不同的Tag值以区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中序线索化是将二叉树按照中序遍历的顺序进行线索化,使得每个节点的前驱和后继指针指向其在中序遍历中的前一个和后一个节点。下面是C语言实现二叉树中序线索化的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; int leftThread; // 左线索标志 int rightThread; // 右线索标志 }; // 创建新节点 struct TreeNode* createNode(int data) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); if (newNode == NULL) { printf("Memory allocation failed!\n"); exit(1); } newNode->data = data; newNode->left = NULL; newNode->right = NULL; newNode->leftThread = 0; newNode->rightThread = 0; return newNode; } // 中序线索二叉树 void inorderThread(struct TreeNode* root, struct TreeNode** prev) { if (root != NULL) { inorderThread(root->left, prev); // 处理当前节点的前驱指针 if (root->left == NULL) { root->left = *prev; root->leftThread = 1; } // 处理前一个节点的后继指针 if (*prev != NULL && (*prev)->right == NULL) { (*prev)->right = root; (*prev)->rightThread = 1; } *prev = root; inorderThread(root->right, prev); } } // 中序遍历线索二叉树 void inorderTraversal(struct TreeNode* root) { struct TreeNode* current = root; // 找到中序遍历的起始节点 while (current->leftThread == 1) { current = current->left; } while (current != NULL) { printf("%d ", current->data); // 如果右指针线索,则直接跳转到后继节点 if (current->rightThread == 1) { current = current->right; } else { // 否则,找到右子树中的最左节点 current = current->right; while (current != NULL && current->leftThread == 0) { current = current->left; } } } } int main() { // 创建二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); // 中序线索二叉树 struct TreeNode* prev = NULL; inorderThread(root, &prev); // 中序遍历线索二叉树 printf("Inorder traversal of threaded binary tree: "); inorderTraversal(root); return 0; } ``` 运行以上代码,将会输出中序线索化后的二叉树的中序遍历结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值