数据结构---二叉树(2)(创建、遍历、求深度、所有叶子节点、路径)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lu_LLLR/article/details/82389541

1.先序创建二叉树,再遍历

2.自由输入字符,空节点由“#”符号代替

3.求二叉树的高

4.找到树中所有叶子节点

5.叶子节点到根节点的路径

代码如下:

#include <stdio.h>
#include <malloc.h>
#define maxSize 100

/************二叉树一个结构体,数据是字符型********/
typedef struct BiTree {
	char data;
	struct node* lchild;
	struct node* rchild;
}BiTree, *BinaryTree;

/*********前序创建二叉树*********/
CreateBiTree(BinaryTree *T)
{
	char ch;
	scanf_s("%c", &ch);
	if ('#' == ch)   //如果输入"#"号,表示这个结点为空
		*T = NULL;
	else
	{
		*T = (BiTree*)malloc(sizeof(BiTree));
		(*T)->data = ch;
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
}

/***************前序遍历***********/
void preorder(BinaryTree T, int level)
{
	if (T != NULL)
	{
		printf("\n%c位于第%d层", T->data, level);
		preorder(T->lchild, level + 1);
		preorder(T->rchild, level + 1);
	}
}

/**************中序遍历**************/
void inorder(BinaryTree T, int level)
{
	if (T != NULL)
	{
		inorder(T->lchild, level + 1);
		printf("\n%c位于第%d层", T->data, level);
		inorder(T->rchild, level + 1);
	}
}

/**************后序遍历***************/
void postorder(BinaryTree T, int level)
{
	if (T != NULL)
	{
		printf("\n%c位于第%d层", T->data, level);
		postorder(T->lchild, level + 1);
		postorder(T->rchild, level + 1);
	}
}

/***********求二叉树的高**********/
int get_height(BinaryTree T)
{
	if (T == NULL)
		return 0;
	else
	{
		int left_height = get_height(T->lchild);
		int right_height = get_height(T->rchild);
		int max = left_height;
		if (max < right_height)
			max = right_height;
		return max + 1;
	}
}
/***************找到树中的叶子节点************/
void findLeaf(BinaryTree T)
{
	if (T != NULL)
	{
		if (T->lchild == NULL && T->rchild == NULL)
			printf("%c ", T->data);
		findLeaf(T->lchild);
		findLeaf(T->rchild);
	}
}

/**************叶子节点到根节点的路径****************/
//当T是空节点,返回上层,不做处理
//当T是叶子节点,将T加入路径中
//当T不是叶子节点也不是空节点时,将该节点加入路径
void getLeafPath(BinaryTree T,char path[],int pathLength)
{
	if (T != NULL)
	{
		if (T->lchild == NULL && T->rchild == NULL)
		{
			path[pathLength] = T->data;
			printf("%c叶子节点到根节点的路径为: ", T->data);
			for (int i = pathLength; i >= 0; i--)
			{
				printf("%c ",path[i]);
				
			}
			printf("\n");
		}
		else
		{
			path[pathLength++] = T->data;
			getLeafPath(T->lchild, path, pathLength);
			getLeafPath(T->rchild, path, pathLength);
			pathLength--;
		}
	}
}


int main()
{
	int level = 1;
	BinaryTree T = NULL;
	int pathLength = 0;
	char path[maxSize];
	printf("请输入结点:");
	CreateBiTree(&T);
	preorder(T, level);
	int height = get_height(T);
	printf("\n二叉树的高度为:%d", height);
	printf("\n二叉树中的叶子节点为:");
	findLeaf(T);
	printf("\n");
	getLeafPath(T, path, pathLength);
	system("pause");
}

构建这么一棵二叉树:

按照先序创建二叉树为:ABC##DE##F##GH#J##I##

结果如图所示:

猜你喜欢

转载自blog.csdn.net/lu_LLLR/article/details/82389541