树和二叉树5——先序遍历输出叶子到根的逆路径

问题描述:采用先序遍历方法输出所有从叶子结点到根结点的逆路径。

输出结果如下:
二叉树 b:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
先序遍历方法:
D 到根结点逆路径: D->B->A
J 到根结点逆路径: J->H->E->B->A
L 到根结点逆路径: L->K->H->E->B->A
N 到根结点逆路径: N->M->K->H->E->B->A
F 到根结点逆路径: F->C->A
I 到根结点逆路径: I->G->C->A
第一条最长逆路径长度:7
第一条最长逆路径:N M K H E B A

核心代码如下:

void  PreOrderPrint_LeavesRoute(BiTree t)
{
	static char stack[100];
	static int i=0,level=0;
	if(t)
	{
		stack[level++]=t->data;
		if(t->lchild==NULL&&t->rchild==NULL)
		{
			i=level;
			printf(" %c 到根结点逆路径: ",stack[i-1]);
			while(i)
			{
				if(i>1)
				printf("%c->",stack[--i]);
				else
				printf("%c\n",stack[--i]);
			}				
		}
		PreOrderPrint_LeavesRoute(t->lchild);
		PreOrderPrint_LeavesRoute(t->rchild);
		level--;
	}	
}

完整代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int flag=1; 
void pre_order_traveral_brackets1(BiTree t)
{   
	if(t)
	{
		printf("%c",t->data);
		if(t->lchild||t->rchild)
		{
			printf("(");flag++;
		}		
		pre_order_traveral_brackets1(t->lchild);
		if(t->rchild)
		printf(",");
		pre_order_traveral_brackets1(t->rchild);
	}
}
void pre_order_traveral_brackets(BiTree t)
{ 
	if(t)
	{
		printf("%c",t->data);  
		printf("(");
		pre_order_traveral_brackets1(t->lchild);
		while(--flag)
		{
			printf(")");
		}
		printf(",");
		pre_order_traveral_brackets1(t->rchild);
		while(flag--+1)
		{
			printf(")");
		}
	}
}

void BiTreecreate(BiTree &t)
{
	char ch;
	char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$";
	static int i=0;
	ch=pch[i++];
	
	if(ch=='$')
	t=NULL;
	else 
	{
		t=(BiTree)malloc(sizeof(BiTNode));
		if(!t)   exit(-1);
		t->data=ch;
		BiTreecreate(t->lchild);
		BiTreecreate(t->rchild); 
	}
}

int BiTreedestroy(BiTree &t)
{
	if(t)
	{
		if(t->lchild)
			BiTreedestroy(t->lchild);
		if(t->rchild)
			BiTreedestroy(t->rchild);
		free(t);
		t=NULL;
	}
	return 1;
}
int max(int a,int b)
{
	return a>b?a:b;
 } 
int Binary_tree_Deepness(BiTree t)//求深度 
{
	if(t==NULL)
		return 0;
	if(!t->lchild&&!t->rchild)
		return 1;
	else
		return 1+max(Binary_tree_Deepness(t->lchild),Binary_tree_Deepness(t->rchild));
}

void  PreOrderPrint_LeavesRoute(BiTree t)
{
	static char stack[100];
	static int i=0,level=0;
	if(t)
	{

		stack[level++]=t->data;
		if(t->lchild==NULL&&t->rchild==NULL)
		{
			i=level;
			printf(" %c 到根结点逆路径: ",stack[i-1]);
			while(i)
			{
				if(i>1)
				printf("%c->",stack[--i]);
				else
				printf("%c\n",stack[--i]);
			}				
		}
		PreOrderPrint_LeavesRoute(t->lchild);
		PreOrderPrint_LeavesRoute(t->rchild);
		level--;
	}
	if(level==0)
	{
		i=Binary_tree_Deepness(t);
		printf(" 第一条最长逆路径长度:%d\n",i);
		printf(" 第一条最长逆路径:");
		while(i)
		{
			printf("%c ",stack[--i]);
		}
	}		
}

int main()
{
	BiTree binarytree;
	BiTreecreate(binarytree);
		
	printf("二叉树 b:");
	pre_order_traveral_brackets(binarytree);
	
	printf("\n先序遍历方法:\n");
	PreOrderPrint_LeavesRoute(binarytree); 

	BiTreedestroy(binarytree);//养成好习惯,有分配有释放 
} 

猜你喜欢

转载自blog.csdn.net/qq_41856733/article/details/84931338