7-2 线索二叉树的建立和遍历

本题要求实现对建立中序线索二叉树和中序遍历中序线索二叉树。

输入格式:

输入为先序序列

输出格式:

输出为中序遍历线索树的结点值以及结点的左右指针信息。

输入样例:

在这里给出一组输入。例如:

AB@D@@CE@@@

输出样例:

B  1  0
D  1  1
A  0  0
E  1  1
C  0  1
#include <stdio.h>

typedef struct BiTNode{
	struct BiTNode *lchild;
	struct BiTNode *rchild;
	char key;
}BiTNode;


//数组存入先序序列 
char List[100];
int m=0,p=0;
//m用于取出数组中序列 ,p用于判定 输出时是否为第一行 (除第一行外都要在开头\n) 

//建立初始化 
BiTNode *InitBiTree(){
	BiTNode* t =(BiTNode *)malloc(sizeof(BiTNode));
	t->lchild = NULL;
	t->rchild = NULL;
	t->key='@';
	return t;
}

//从数组的先序序列中获得二叉树 
void GetBiTree(BiTNode* bt)
{
	if(List[m]!='\n')
	{
		bt->key=List[m++];
		if(bt->key!='@')
		{
			BiTNode *n=InitBiTree();
			GetBiTree(n);
			if(n->key!='@')bt->lchild = n;
		}
		if(bt->key!='@')
		{
			BiTNode *u=InitBiTree();
			GetBiTree(u);
			if(u->key!='@')bt->rchild = u;
		}
	}
}
//这是一个递归函数 

//输出这个树结点 
void  PrintTree(BiTNode* x)
{	
 	if(p==0)p++;
 	else printf("\n");
	printf("%c  ",x->key);
	if(x->lchild)printf("0  ");
	else printf("1  ");
	if(x->rchild)printf("0");
	else printf("1");		
}

//中序输出这个树 
void  OutTree(BiTNode* x)
{	
	BiTNode* n = x->lchild ;
	BiTNode* u = x->rchild ;
	if(n)OutTree(n);
	PrintTree(x);
	if(u)OutTree(u);
}
//这是一个递归函数 

//写出主函数 
int main()
{ 	
    gets(List);
	BiTNode *bt=InitBiTree();
	GetBiTree(bt);
	OutTree(bt);
} 

下面是基于链表实现的二叉树建立遍历的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node *left; struct Node *right; }; void inorder(struct Node *root) { if (root != NULL) { inorder(root->left); printf("%d ", root->data); inorder(root->right); } } void preorder(struct Node *root) { if (root != NULL) { printf("%d ", root->data); preorder(root->left); preorder(root->right); } } void postorder(struct Node *root) { if (root != NULL) { postorder(root->left); postorder(root->right); printf("%d ", root->data); } } struct Node* newNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } struct Node* insert(struct Node* node, int data) { if (node == NULL) { return newNode(data); } if (data < node->data) { node->left = insert(node->left, data); } else if (data > node->data) { node->right = insert(node->right, data); } return node; } int main() { struct Node *root = NULL; root = insert(root, 50); insert(root, 30); insert(root, 20); insert(root, 40); insert(root, 70); insert(root, 60); insert(root, 80); printf("Inorder traversal: "); inorder(root); printf("\nPreorder traversal: "); preorder(root); printf("\nPostorder traversal: "); postorder(root); return 0; } ``` 上述代码中,`Node` 结构体定义了二叉树的节点,包括节点的值、左子节点和右子节点。`newNode` 函数用于创建一个新的节点。`insert` 函数用于将一个节点插入到二叉树中。 `inorder`、`preorder` 和 `postorder` 分别用于实现中序遍历、前序遍历和后序遍历。在主函数中,我们将数据插入二叉树中,并按照不同的方式遍历输出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值