0
点赞
收藏
分享

微信扫一扫

每天一个数据分析题(二百六十一)

fbd4ffd0717b 04-14 22:30 阅读 2

二叉树(1):深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客

二叉树(2):深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度-CSDN博客

前言:

目录

一、什么是二叉树?

二、二叉树的节点结构

三、二叉树的遍历

前序遍历:

中序遍历:

后序遍历:

四、二叉树的基本操作

1、创建二叉树

2、前序、中序、后序

3、求二叉树的节点个数

4、求二叉树叶子节点的个数

5、树的高度

6、二叉树第k层的节点个数

7、二叉树查找值为x的节点

五、完整代码实例

总结


一、什么是二叉树?

二、二叉树的节点结构

typedef int TreeDataType;
typedef struct Tree
{
	TreeDataType a;
	struct Tree* left;
	struct Tree* right;
}Tree;

节点结构里面定义有两个递归,是为了方便后面的遍历

三、二叉树的遍历

二叉树的遍历是我们学习二叉树首先要了解的东西,我们都知道二叉树其实就是一串数组,那我们是如何访问他们的呢?这里就牵扯到了遍历顺序的问题。

二叉树的遍历有三种形式:前序、中序和后序

  1. 前序遍历:

  2. 中序遍历:

  3. 后序遍历:

    例如:

四、二叉树的基本操作

int main()
{
	Tree* root = CreatTree();
	//前序
	printf("前序:");
	PrevTree(root);
	printf("\n");
	//中序
	printf("中序:");
	HalfTree(root);
	printf("\n");
	//后序
	printf("后序:");
	PostTree(root);
	printf("\n");
	//节点个数
	int count = BTreeSize(root);
	printf("BTreeSize:%d\n", count);
	//叶子节点个数
	printf("BTreeLeafSize:%d\n", BTreeLeafSize(root));
	//树的高度
	printf("BTreeHigh:%d\n", BTreeHigh(root));
	//二叉树第k层节点个数
	printf("BTreeLevelKSize:%d\n", BTreeLevelKSize(root, 3));
	//二叉树查找值为x的节点
	

    return 0;
}

1、创建二叉树

//二叉树
typedef int TreeDataType;
typedef struct Tree
{
	TreeDataType a;
	struct Tree* left;
	struct Tree* right;
}Tree;
//初始化二叉树
Tree* TreeInit(TreeDataType x)
{
	Tree* m = (Tree*)malloc(sizeof(Tree));
	if (m == NULL)
	{
		perror("TreeInit");
		return NULL;
	}
	m->a = x;
	m->left = NULL;
	m->right = NULL;
	return m;
}
//创建一个二叉树
Tree* CreatTree()
{
	Tree* n1 = TreeInit(3);
	Tree* n2 = TreeInit(5);
	Tree* n3 = TreeInit(6);
	Tree* n4 = TreeInit(7);
	Tree* n5 = TreeInit(9);

	n1->left = n2;
	n1->right = n3;
	n2->left = n4;
	n2->right = n5;

	return n1;
}

2、前序、中序、后序

//前序
void PrevTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->a);
	PrevTree(root->left);
	PrevTree(root->right);
}
//中序
void HalfTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	HalfTree(root->left);
	printf("%d ", root->a);
	HalfTree(root->right);
}
//后序
void PostTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PostTree(root->left);
	PostTree(root->right);
	printf("%d ", root->a);
}

运行结果:

3、求二叉树的节点个数

//二叉树节点个数
int BTreeSize(Tree* root)
{
	//分治的思想
	if (root == NULL)
	{
		return 0;
	}
	return BTreeSize(root->left) + BTreeSize(root->right)+1 ;
}

用到了递归的思想,下面的内容都要用递归来解决,如果递归学的不太好建议画图来看这些过程如何进行的

运行结果:

4、求二叉树叶子节点的个数

//二叉树叶子节点个数
int BTreeLeafSize(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BTreeLeafSize(root->left) + BTreeLeafSize(root->right);
}

运行结果:

5、树的高度

//求二叉树高度
int BTreeHigh(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftHigh = BTreeHigh(root->left);
	int rightHigh = BTreeHigh(root->right);

	return leftHigh > rightHigh ? leftHigh + 1 : rightHigh + 1;
}

运行结果:

6、二叉树第k层的节点个数

//二叉树第k层节点个数
int BTreeLevelKSize(Tree* root, int k)
{
	assert(k > 0);
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}

运行结果:

7、二叉树查找值为x的节点

//二叉树查找值为x的节点
Tree* BTreeFind(Tree* root,int x)
{
	if (root == NULL)
		return NULL;
	if (root->a == x)
		return root;
	Tree* ret1 = BTreeFind(root->left, x);
	if (ret1)
	{
		return ret1;
	}
	Tree* ret2 = BTreeFind(root->right, x);
	if (ret2)
	{
		return ret2;
	}
}

五、完整代码实例

//二叉树
typedef int TreeDataType;
typedef struct Tree
{
	TreeDataType a;
	struct Tree* left;
	struct Tree* right;
}Tree;
//初始化二叉树
Tree* TreeInit(TreeDataType x)
{
	Tree* m = (Tree*)malloc(sizeof(Tree));
	if (m == NULL)
	{
		perror("TreeInit");
		return NULL;
	}
	m->a = x;
	m->left = NULL;
	m->right = NULL;
	return m;
}
//创建一个二叉树
Tree* CreatTree()
{
	Tree* n1 = TreeInit(3);
	Tree* n2 = TreeInit(5);
	Tree* n3 = TreeInit(6);
	Tree* n4 = TreeInit(7);
	Tree* n5 = TreeInit(9);

	n1->left = n2;
	n1->right = n3;
	n2->left = n4;
	n2->right = n5;

	return n1;
}
//前序
void PrevTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->a);
	PrevTree(root->left);
	PrevTree(root->right);
}
//中序
void HalfTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	HalfTree(root->left);
	printf("%d ", root->a);
	HalfTree(root->right);
}
//后序
void PostTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PostTree(root->left);
	PostTree(root->right);
	printf("%d ", root->a);
}
//二叉树节点个数
int BTreeSize(Tree* root)
{
	//分治的思想
	if (root == NULL)
	{
		return 0;
	}
	return BTreeSize(root->left) + BTreeSize(root->right)+1 ;
}
//二叉树叶子节点个数
int BTreeLeafSize(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BTreeLeafSize(root->left) + BTreeLeafSize(root->right);
}
//求二叉树高度
int BTreeHigh(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftHigh = BTreeHigh(root->left);
	int rightHigh = BTreeHigh(root->right);

	return leftHigh > rightHigh ? leftHigh + 1 : rightHigh + 1;
}
//二叉树第k层节点个数
int BTreeLevelKSize(Tree* root, int k)
{
	assert(k > 0);
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}
//二叉树查找值为x的节点
Tree* BTreeFind(Tree* root,int x)
{
	if (root == NULL)
		return NULL;
	if (root->a == x)
		return root;
	Tree* ret1 = BTreeFind(root->left, x);
	if (ret1)
	{
		return ret1;
	}
	Tree* ret2 = BTreeFind(root->right, x);
	if (ret2)
	{
		return ret2;
	}
}
int main()
{
	Tree* root = CreatTree();
	//前序
	printf("前序:");
	PrevTree(root);
	printf("\n");
	//中序
	printf("中序:");
	HalfTree(root);
	printf("\n");
	//后序
	printf("后序:");
	PostTree(root);
	printf("\n");
	//节点个数
	int count = BTreeSize(root);
	printf("BTreeSize:%d\n", count);
	//叶子节点个数
	printf("BTreeLeafSize:%d\n", BTreeLeafSize(root));
	//树的高度
	printf("BTreeHigh:%d\n", BTreeHigh(root));
	//二叉树第k层节点个数
	printf("BTreeLevelKSize:%d\n", BTreeLevelKSize(root, 3));
	//二叉树查找值为x的节点
	

    return 0;
}

运行结果:

总结

创作不易,还请各位大佬点个小小的赞!!!

举报

相关推荐

0 条评论