二叉树中序遍历线索化 C++ 递归实现

二叉树中序遍历线索化

中序遍历有一个特点,只要不是叶子节点,遍历的时候左孩子一定是当前节点的上一个访问节点;右孩子一定是当前节点的下一个访问节点。

如果把叶子节点的左右孩子都利用起来,把空的左孩子做成前驱线索,右孩子做成后继线索,就可以实现整个二叉树每一个节点的左孩子就是它的上一个访问节点,右孩子就是它的下一个访问节点。

重点需要处理的就是第一个访问节点的前驱节点以及最后一个访问节点的后继节点,只需要创建一个新节点作为中介就行!

代码:

#include<iostream>
using namespace std;
typedef struct BiTNode
{
	string data;
	BiTNode* lchild, * rchild;
	int ltag , rtag ;//0代表孩子,1代表线索
};
BiTNode* pre = NULL;//后面第一次线索化的时候必须给初值
string s;
void creatBiTree(BiTNode*& p)//参数传指针引用
{
	string  S;
	cout << "请按照先序遍历的顺序输入数据,#代表NULL:";
	cin >> S;
	if (S == "#")
	{
		(p) = NULL;
	}
	else
	{
		p = new BiTNode();
		(p)->data = S;
		p->ltag = 0;
		p->rtag = 0;
		creatBiTree(p->lchild);
		creatBiTree(p->rchild);
	}
}
void inOrder(BiTNode* p)//中序遍历线索化
{
	if (p)
	{
		inOrder(p->lchild);
		if (p->lchild == NULL)//左孩子递归,一直到该节点没有左孩子,就把左孩子做成前驱线索
		{
			p->lchild = pre;
			p->ltag = 1;
		}
		if (pre && !(pre->rchild))//看看上一个访问节点是否有右孩子,没有右孩子的话设置上一个访问节点的后继节点为当前节点
		{
			pre->rchild = p;//因为每次都不知道下一个访问的节点将会是什么,所以每次只能设置上一个节点的后继节点
			pre->rtag = 1;
		}
		pre = p;//设置p为上一次访问的节点
		inOrder(p->rchild);

	}
}
void headOrder(BiTNode*& T, BiTNode* p)//p是二叉树,T是头节点
{
	T = new BiTNode();//创建一个新节点的目的是作为第一个访问节点的前驱节点,同时也作为最后访问节点的后继节点。
	T->ltag = 0;
	T->rtag = 1;
	T->rchild = T;
	if (!p)//如果二叉树为空,就不需要线索化了
	{
		T->lchild = T;
	}
	else//不为空就把新节点的左孩子指向该二叉树的头节点
	{
		T->lchild = p;
		T->ltag = 1;
		pre = T;
		inOrder(p);//出来之后的pre是二叉树访问的最后一个节点,将他的后继设为头节点
		pre->rtag = 1;
		pre->rchild = T;
		T->rchild = pre;
	}
}
int main()
{
	BiTNode* S;
	BiTNode* p;
	creatBiTree(S);
	headOrder(p, S);
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页