线索二叉树的建立及遍历

连写3篇博客。。。记录这2天的学习内容。。。大笑


代码。。。。

// 参考 大话数据结构

#include <iostream>

#define NULLCHAR '#'

using namespace std;

enum Type{ LINK, THREAD };

typedef struct BiTrtree
{
	char data;
	struct BiTrtree *left, *right;
	Type lType, rType;
}bitrtree, *bitrtreePtr;

//中序线索化
bitrtreePtr preNode = NULL;            //必须有这个
void inThreading(bitrtreePtr tree)
{
    /*
        这种方法会导致右子树最后一个节点的rType没被标成THREAD
    */
	if (tree)
	{
		inThreading(tree->left);   //递归左子树

		if (tree->left == NULL)
		{
			tree->lType = Type::THREAD;
			tree->left = preNode;
		}
		if (preNode && preNode->right == NULL)   //这里要判断preNode是否存在
		{
			preNode->rType = Type::THREAD;
			preNode->right = tree;
		}
		preNode = tree;

		inThreading(tree->right);   //递归右子树
	}
}

//二叉树的建立
void createTree(bitrtreePtr *tree)
{
	char c;
	cin >> c;
	if (c == NULLCHAR)
		*tree = NULL;
	else
	{
		*tree = (bitrtreePtr)malloc(sizeof(bitrtree));
		(*tree)->data = c;
		(*tree)->lType = Type::LINK;
		(*tree)->rType = Type::LINK;
		createTree(&(*tree)->left);
		createTree(&(*tree)->right);
	}
}

//线索二叉树的遍历
void traversal(bitrtreePtr tree)  //从左往右
{
	while (tree)   //为空的时候结束循环
	{
		while (tree->left && tree->lType == Type::LINK)  //左子树存在且类型为LINK,则循环到要输出的第一个节点
			tree = tree->left;
		cout << tree->data;
		while (tree->right && tree->rType == Type::THREAD)//右子树存在且类型为THREAD,则循环输出它们的data
		{
			tree = tree->right;
			cout << tree->data;
		}
		tree = tree->right;  //进入右子树
	}
	cout << endl;
}

void traversal2(bitrtreePtr tree) //从右往左
{
	while (tree)
	{
		while (tree->right && tree->rType == Type::LINK)
		{
			tree = tree->right;
		}
		cout << tree->data;
		while (tree->left && tree->lType == Type::THREAD)
		{
			tree = tree->left;
			cout << tree->data;
		}
		tree = tree->left;
	}
	cout << endl;
}

//ABCDF###E###GH##I#J##
int main()
{
	bitrtreePtr tree = NULL;
    //生成二叉树
	createTree(&tree);
    //中序线索化
	inThreading(tree);
    cout << "Left to right:";
    traversal(tree);
    cout << "Right to left:";
	traversal2(tree);
	return 0;
}


测试数据"ABCDF###E###GH##I#J##"生成的线索二叉树

主要就是空的左儿子指向前驱,空的右儿子指向后继,(画的有点难看=。=)



结果。。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值