二叉树(五)中序线索二叉树的建立

如果ltag值为0,表示lchild指向结点的左孩子,如果ltag=1,表示lchild结点指向结点的前驱;如果rtag=0,表示rchild指向结点的右孩子,如果rtag=1,表示rchild指向结点的后继。

要求输入一个先序创建二叉树所需要的先序序列,按照中序方式输出该二叉树所对应的线索二叉树的每个结点,包括它的ltag,data,rtag三个域的值。二叉树的数据域类型为字符型,扩展二叉树的叶子结点用‘#’表示。

输入描述:

输入一棵扩展二叉树的先序遍历序列,共用一行,直接输入某二叉树的加了叶子结点的扩展二叉树字符序列,以空格隔开。

输出描述:

输出中序遍历的该二叉树所对应线索二叉树的每个结点,包括它的ltag,data,rtag域,输出格式为每行一个结点,数据之间以空格隔开

输入样例:

A B # # C D # E # F # # G H # I K # # # #

输出样例:

1 B 1
0 A 0
1 D 0
1 E 0
1 F 1
0 C 0
1 H 0
1 K 1
0 I 1
0 G 1
#include<iostream>
using namespace std;
struct Node
{
	char data;
	Node *lchild,*rchild;
	int ltag,rtag;
};

class InTree
{
	public:
		InTree();
		Node *next(Node *p);
		void InOrder();	
		void inOrder()
		{
			inOrder(root);
		}
	protected:
		Node *root;
		Node *Creat(Node *b);
		void print(Node *b,Node *pre);
		void inOrder(Node *b);
};

Node *InTree::Creat(Node *b)
{
	char ch;
	cin>>ch;
	Node *c;
	if(ch=='#')
	{
		b = NULL;
	}
	else
	{
		b = new Node;
		b->data = ch;
		b->lchild = Creat(b->lchild);
		if(b->lchild == NULL)
		b->ltag = 1;
		else
		{
			b->ltag = 0;
		}	
		b->rchild = Creat(b->rchild);
		if(b->rchild == NULL)
		b->rtag = 1;
		else
		{
			b->rtag = 0;	
		}	
	}
	return b;
}

void InTree::print(Node *b,Node *pre)
{
	if(b==NULL)
	return ;
	
	print(b->lchild,pre);
	
	if(b->lchild==NULL)
	{
		b->ltag = 1;
		b->lchild = pre;
	}
	if(b->rchild==NULL)
	{
		b->rtag = 1;	
	}
	if(pre->rtag==1)
	{
		pre->rchild = b;	
	}
	
	pre = b;
	print(b->rchild,pre);
}

InTree::InTree()
{
	root = Creat(root);
}

Node *InTree::next(Node *p)
{
	Node *q;
	if(p->rtag==1)
	{
		q = p->rchild;	
	}
	else
	{
		q = p->rchild;
		while(q->ltag ==0)
		{
			q = q->lchild;
		}	
	}
	return q;
}

void InTree::InOrder()
{
	Node *p;
	if(root==NULL)
	return ;
	while(p->ltag==0)
	p = p->lchild;
	cout<<p->data;
	while(p->rchild!=NULL)
	{
		p = next(p);
		cout<<p->data;
	}
}

void InTree::inOrder(Node *b)
{
	if(b==NULL)
	{
		return ;
	}
	else
	{
		inOrder(b->lchild);
		cout<<b->ltag<<" ";
		cout<<b->data<<" ";
		cout<<b->rtag<<endl;
		inOrder(b->rchild);
	}
}
int main()
{
	InTree a;
	a.inOrder();
	return 0;
}


猜你喜欢

转载自blog.csdn.net/wfy2695766757/article/details/84777446