线索二叉树:C++实现

引言:

        线索二叉树是一种特殊的二叉树,它可以通过线索(线索是指在二叉树中将空指针改为指向前驱或后继的指针)的方式将二叉树转化为一个线性结构,从而方便对二叉树进行遍历。本文将介绍如何使用C++实现线索二叉树。

技术实现:

        首先,我们需要定义一个结构体来表示线索二叉树的节点。结构体中包含了节点的数据、左右子节点以及左右线索标记。

template
struct ThrNode
{
    Element data;
    ThrNode* lchild;
    ThrNode* rchild;
    int lTag;
    int rTag;
};

        其中,lTag和rTag分别表示左右线索标记。如果lTag为0,则表示该节点的左子节点为普通子节点;如果lTag为1,则表示该节点的左子节点为前驱节点。rTag同理。

接下来,我们使用一个类来表示线索二叉树。该类中包含了根节点以及一些方法。

template
class InThrBiTree
{
public:
    InThrBiTree();
    ~InThrBiTree();
    void inOrder();
private:
    ThrNode* root;
    void createTree(ThrNode*& node);
    void destroyTree(ThrNode* node);
    ThrNode* first(ThrNode*node);
    ThrNode* next(ThrNode* node);
    void createInThread(ThrNode*& node, ThrNode*& pre);
};

        其中,createTree方法用于创建线索二叉树,destroyTree方法用于销毁线索二叉树,inOrder方法用于中序遍历线索二叉树。first方法用于找到中序遍历的第一个节点,next方法用于找到中序遍历中的下一个节点。createInThread方法用于创建中序遍历的线索。

接下来看怎么实现:

template
InThrBiTree::InThrBiTree()
{
	createTree(root);
	ThrNode* pre = nullptr;
	if (root != nullptr)
	{
		createInThread(root, pre);
		pre->rTag = 1;
	}
}

template
InThrBiTree::~InThrBiTree()
{
	destroyTree(node);
}

template
void InThrBiTree::inOrder()
{
	ThrNode* p = first(p);
	while (p != nullptr) {
		cout << p->data << " ";
		p = next(p);
	}
	cout << endl;
}

template
void InThrBiTree::createTree(ThrNode*& node)
{
	char item;
	cin >> item;
	if (item == '#')
		node = nullptr;
	else {
		node = new BiNode;
		node->data = item;
		createTree(node->lchild);
		createTree(node->rchild);
	}
}

template
void InThrBiTree::destroyTree(ThrNode* node)
{
	if(node!=nullptr){
		destroyTree(node->lchild);
		destroyTree(node->rchild);
		delete node;
	}
}

template
ThrNode* InThrBiTree::first(ThrNode* node)
{
	ThrNode* p = node;
	while (p->lTag == 0)
		p = p->lchild;
	return p;
}

template
ThrNode* InThrBiTree::next(ThrNode* node)
{
	ThrNode* p = node->rchild;
	if (node->rTag == 1) {
		return p;
	}
	else {
		return first(p);
	}
}

template
inline void InThrBiTree::createInThread(ThrNode*& node, ThrNode*& pre)
{
	if (node == nullptr) return;
	createInThread(node->lchild, pre);
	if (node->lchild == nullptr)
	{
		node->lchild = pre;
		node->lTag = 1;
	}
	if (pre != nullptr && pre->rchild == nullptr)
	{
		pre->rchild = node;
		pre->rTag = 1;
	}
	pre = node;
	createInThread(node->rchild, pre);
}

最后,我们来看一下如何使用该类来创建和遍历线索二叉树。

int main()
{
    InThrBiTree tree;
    tree.createTree(tree.root);
    tree.createInThread(tree.root, nullptr);
    tree.inOrder();
    tree.destroyTree(tree.root);
    return 0;
}

        首先创建一个InThrBiTree对象,然后调用createTree方法创建线索二叉树,接着调用createInThread方法创建中序遍历的线索,最后调用inOrder方法中序遍历线索二叉树。最后,调用destroyTree方法销毁线索二叉树。 

结尾:

        以上就是使用C++实现线索二叉树的方法。线索二叉树是一种非常实用的数据结构,它可以方便地对二叉树进行遍历。通过本文的介绍,相信读者已经掌握了如何使用C++实现线索二叉树的方法。

你可能感兴趣的:(数据结构,c++,数据结构,算法)