使用二叉链表存储二叉树,并给出根结点到任一结点的路径

#include
#include
#include
#include

typedef struct LinkStack  //链栈的结点结构
{
     
	char data;
	struct LinkStack *next;
}LinkStack;

typedef struct BiTNode  //二叉树的结点结构
{
     
	char data;
	struct BiTNode *lChild,*rChild;
}BiTNode,*BiTree;

LinkStack *L;  //链栈的栈顶指针
int flag;  //标志 

void PushStack(char x); //入栈
char PopStack();  //出栈
void CreateBiTree(BiTree *T);  //先序创建二叉树
void TraverseBiTree(BiTree T);  //先序遍历二叉树
void CheckBiTree(BiTree T,char p);  //查找指定结点,并且记录路径
void Path(BiTree T,char p);  //输出路径


/**--------主函数--------**/
int main()
{
     
	BiTree root;  //root指向根结点
	char p;  //p指向指定结点
	printf("请输入第一个结点的值,#表示没有叶结点:\n");
	CreateBiTree(&root);
	printf("先序遍历二叉树:\n");
	TraverseBiTree(root);
	printf("\n");
	printf("请输入指定结点,以求出根结点到指定结点的路径:\n");
	scanf("%c",&p);
	Path(root,p);
	return 0;
}


/*--------链栈的函数--------*/
void PushStack(char x)  //入栈
{
     
	LinkStack *top;
	top = (LinkStack *)malloc(sizeof(LinkStack));
	top->data = x;
	top->next = L;
	L = top;
}

char PopStack()  //出栈
{
     
	char x;
	if(L->next == NULL)  
	{
     
		printf("空栈\n");
		exit(1);
	}
	else
	{
     
		LinkStack *top;
		x = L->data;
		top = L;
		L = top->next;
		free(top);
		return x;
	}
}


/*--------二叉树的函数--------*/
void CreateBiTree(BiTree *T)  //先序创建二叉树
{
     
	char ch;
	ch=getchar();
	getchar();  //吃掉空格
	if(ch == '#') 
		*T=NULL;
	else
	{
     
		*T=(BiTree)malloc(sizeof(BiTNode));
		if(!(*T))  //分配空间失败
			exit(-1);
		(*T)->data=ch;
		printf("输入%c的左孩子结点:",ch);
		CreateBiTree(&(*T)->lChild);
		printf("输入%c的右孩子结点:",ch);
		CreateBiTree(&(*T)->rChild);
	}
}

void TraverseBiTree(BiTree T)  //先序遍历二叉树
{
     
	if(T==NULL)  //二叉树为空
	{
     
		return;
	}
	printf("%c",T->data);
	TraverseBiTree(T->lChild);
	TraverseBiTree(T->rChild);
}

void CheckBiTree(BiTree T,char p)  //查找指定结点,并且记录路径
{
     
	if(T==NULL)  //二叉树为空
	{
     
		return;
	}
	if(flag)
	{
     
		printf("入栈%c\n",T->data);
		PushStack(T->data);  //入栈
	}
	if(T->data == p)
	{
     
		printf("指定结点%c\n",T->data);
		flag = 0;  //找到指定结点,标志取0
		return;
	}
	CheckBiTree(T->lChild,p);
	CheckBiTree(T->rChild,p);
	if(flag)
	{
     
		printf("出栈%c\n",T->data);
		PopStack();
	}
}

void Path(BiTree T,char p)  //输出路径
{
     
	int i;
	char temp[30];
	flag = 1;  //标志为1
	L = (LinkStack *)malloc(sizeof(LinkStack));
	L->next = NULL;
	if(T==NULL)
		return;
	CheckBiTree(T,p);
	for(i=0;L->next;i++)
	{
     
		temp[i] = PopStack();  
	}
	printf("根结点到p所指结点的路径为:\n");
	for(i--;i>=0;i--)
	{
     
		printf("%c",temp[i]);  //输出正确路径
	}
	printf("\n");
}

使用二叉链表存储二叉树,并给出根结点到任一结点的路径_第1张图片
使用二叉链表存储二叉树,并给出根结点到任一结点的路径_第2张图片
如果感觉不错,那就给我点个赞吧(ノ ̄▽ ̄)

你可能感兴趣的:(数据结构与算法,C语言描述,C语言,链栈,数据结构与算法)