线索二叉树的中序构造及遍历

 中序遍历的顺序:左根右 

1.一路往左找到最左子树的最左节点

2.父节点的右节点不为空则以该节点为新的父节点重复1

3.右节点为空则向上回溯

线索化:Tag=0表示有直接节点,Tag=1表示回溯节点。根据遍历顺序建立前驱与后继指针。

/*
  中序线索化
*/

void in_thread(BiTNode *root, BiTNode **prev) { //用二级指针是因为要修改一级指针

	if((root == NULL)) return;  //当前父节点不为空才继续

	in_thread(root->lchild, prev); //递归调用,找到最最左边的孩子

	if(root->lchild == NULL) { //如果左节点为空
		root->lchild = *prev;  //左孩子的前驱线索指针构建
		root->lTag = 1;   //修改标签
	}

	if(*prev != NULL && *(prev)->rchild == NULL) { //前驱不为空且右孩子为空
		(*prev)->rchild = root;  //prev的后继指针构建
		(*(prev))->rTag = 1;   //修改标签
	}

	(*prev) = root;  //前驱指针指向当前父节点
}

遍历:

/*
   遍历函数的子函数__找后继
*/
void *NextNode(BiTNode *root) { 

	if(root == NULL) return;

	BiTNode *tmp;  //结果指针

	if(root->rTag == 1) tmp = root->rchild;  //如果有后继,可以直接找后继
	else {
		tmp = root->rchild;
		while(tmp->lTag == 0){
			tmp = tmp->lchild;   //如果有左节点则要一路向下找到最左的那个
		}
	}
	
	return tmp; //返回寻找的节点指针
}

/*
   中序线索化的二叉树遍历
*/
void in_thread_go(BiTNode *root){
	
	if(root == NULL) return;
	
	while(root->lTag == 0) root = root->lchild; //最左
	
	print(root->data); //输出该节点数据(伪代码,类型未知因为)
	
	while(root->rchild != NULL){  //如果右节点不为空,可以理解为有后续
		
		root = NextNode(root);  //寻找下一个节点
		print(root->data);
	}
	
}

你可能感兴趣的:(厦大数据结构实验课,c语言,线索化二叉树,二叉树,遍历,中序遍历)