線索二叉樹的建立及遍歷

連寫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##"生成的線索二叉樹

主要就是空的左兒子指向前驅,空的右兒子指向後繼,(畫的有點難看=。=)



結果。。。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章