线索二叉树的建立及遍历(中序)

/**
*2018.09.16  12:30
*线索二叉树的建立及遍历(中序)
*/
#include<stdio.h>
#define MAX 100


typedef struct BTNode {
	int e;
	struct BTNode *rchild, *lchild;
	int ltag, rtag;
}BTNode;

void inThread(BTNode *, BTNode **);
void createInThread(BTNode *);
BTNode * getFirst(BTNode *);
BTNode * getLast(BTNode *);
BTNode * getPrecursor(BTNode *);
BTNode * getSucceeding(BTNode *);
void traverseInThread(BTNode *);


int main(void) {
	system("COLOR fc");



	putchar('\n');
	system("pause");
	return 0;
}


void inThread(BTNode *p, BTNode **pre) {
	if (NULL != p) {
		inThread(p->lchild, pre);

		if (NULL == p->lchild) {
			p->lchild = *pre;
			p->ltag = 1;
		}
		if (NULL != *pre && NULL == (*pre)->rchild) {
			(*pre)->rchild = p;
			(*pre)->rtag = 1;

		}
		*pre = p;
	
		inThread(p->lchild, pre);
	}
}


void createInThread(BTNode *p) {
	if ( NULL != p) {
		BTNode *pre = NULL;
		inThread(p, &pre);
	
		pre->rtag = 1;
		pre->rchild = NULL;
	}
}


BTNode* getFirst(BTNode *p) {
	if (NULL != p) {
		while (0 == p->ltag) 
			p = p->lchild;
		return p->lchild;
	}
	else return NULL;
}


BTNode* getLast(BTNode *p) {
	if (NULL != p) {
		while (0 == p->rtag) 
			p = p->rchild;
		return p->rchild;
	}
	else return NULL;
}


BTNode* getPrecursor(BTNode *p) {
	if (NULL != p) {
		if (1 == p->ltag)
			return p->lchild;
		else return getLast(p->lchild);
	}
	else return NULL;
}


BTNode* getSucceeding(BTNode *p) {
	if (NULL != p) {
		if (1 == p->rtag)
			return p->rchild;
		else return getFirst(p->rchild);
	}
	else return NULL;
}


void traverseInThread(BTNode *p){
	for (p = getFirst(p); p = getSucceeding(p); NULL != p)
		printf("%5d ", p->e);	
}
线索二叉树是一种对二叉搜索树的一种增强,它除了存储常规的节点信息外,还额外添加了一些指针,使得遍历过程中可以不需要访问实际的前驱或后继节点就能确定下一个待访问节点。主要有三种类型的线索:前驱线索、当前节点和后继线索。 1. **中线索化**: 中线索二叉树在中序遍历时,对于每个节点,它的左孩子线索指向其左兄弟(如果存在),如果没有左兄弟,则指向NULL;右孩子线索指向其直接右子节点。 2. **先线索化**: 先线索化通常用于构建线索链表的开始。根节点的右孩子线索总是指向其第一个子节点,其他节点的左孩子线索指向其父节点,右孩子线索指向其直接右子节点。 3. **先序遍历**: 从根节点开始,按照“左->当前节点->右”的顺访问节点,并利用线索判断下一步访问谁。 4. **中序遍历**: 遵循“当前节点->左->右”的顺,通过线索找到左孩子的后继节点。 为了编写程表示这种结构,你可以使用递归或迭代的方式。这里提供一个简单的Python示例,假设有一个基本的二叉树节点定义: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right self.prev = None # 前驱线索 self.next = None # 后续线索 # 中线索化的函数示例 def inorder_traversal_with_links(root): if root is not None: stack = [] curr = root while True: while curr is not None: stack.append(curr) curr = curr.left if not stack: break node = stack.pop() print(node.val) # 访问节点 curr = node.right # 跳转到右子节点(如果有) if curr is not None: node.next = curr # 设置后续线索 curr.prev = node # 初始化并线索化一个例子 root = ... # 初始化一个二叉树 inorder_traversal_with_links(root) ``` 注意,这只是一个基础示例,实际应用中可能需要处理更多边界条件和细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值