二叉树的构建、前、中、后序遍历、结点个数、叶子结点个数、第K层结点个数、

二叉树

本篇博客主要是带来二叉树的相关操作的实现,内容很详细。

  1. 二叉树建立
  2. 求结点个数
  3. 求叶子结点个数
  4. 求第K层结点个数
  5. 查找值为X的结点
  6. 前、中、后序遍历

1. 二叉树的建立

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
//这里的a是树的所有结点元素的数组,pi是a的下标的地址
//这里是解释[为何下标要传指针](https://blog.csdn.net/weixin_50168448/article/details/112968041)
{
    
    
	//#表示空节点,空节点不需要开辟空间直接返回
	if (a[*pi] == '#')
	{
    
    
		(*pi)++;
		return NULL;
	}

	//前序遍历 先建立根
	BTNode *root = malloc(sizeof(BTNode));
	root->_val = a[*pi];
	(*pi)++;

	root->_left = BinaryTreeCreate(a, pi);
	root->_right = BinaryTreeCreate(a, pi);

	//最后链接起来
	return root;
}

2. 求二叉树结点个数

// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
    
    
	//这里使用的是前序遍历
	
	//root是空节点返回0
	if (root == NULL)
	{
    
    
		return 0;
	}

	//root不是空结点,算是一个结点
	//返回 1   +       左子树的节点数     +      右子树的节点数             
	return 1 + BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right);

}

3. 求叶子结点个数

// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
    
    
	//递归出口:空节点
	if (root == NULL)
	{
    
    
		return 0;
	}

	//递归出口:当前节点是叶子节点
	if (root->_left == NULL && root->_right == NULL)
	{
    
    
		return 1;
	}

	//左子树的叶子结点个数+右子树的叶子结点个数
	return BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right);
	 
}

4. 第K层结点个数

// 二叉树第k层节点个数
//对于第K层结点来讲相当于是第一层结点
int BinaryTreeLevelKSize(BTNode* root, int k)
{
    
    
	if (root == NULL)
	{
    
    
		return 0;
	}
	
	//递归递归出口,k = 1 说明当前层就是 整个二叉树的第 k 层
	if (k == 1)
	{
    
    
		return 1;
	}

	//左右子树的第 K-1 层之和 
	return BinaryTreeLevelKSize(root->_left,k-1) + BinaryTreeLevelKSize(root->_right, k - 1);
}

5. 查找值为X的节点

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
    
    
	//前序遍历

	if (root == NULL)
	{
    
    
		return NULL;
	}

	//判断根节点,若是返回根节点
	if (root->_val == x)
	{
    
    
		return root;
	}

	//根节点不是,遍历左子树查找,找到就返回该结点
	BTNode *node = BinaryTreeFind(root->_left, x);
	if (node != NULL)
	{
    
    
		return node;
	}

	//左子树没找到遍历右子树找,找到返回该结点
	node = BinaryTreeFind(root->_right, x);
	if (node != NULL)
	{
    
    
		return node;
	}

	//右子树也没找到返回NULL  
	return NULL;
}

6. 前、中、后序遍历

// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root)
{
    
    
	if (root == NULL)
	{
    
    
		return;
	}

	printf("%c ", root->_val);
	BinaryTreePrevOrder(root->_left);
	BinaryTreePrevOrder(root->_right);
}

// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
    
    
	if (root == NULL)
	{
    
    
		return;
	}
	BinaryTreeInOrder(root->_left);
	printf("%c ", root->_val);
	BinaryTreeInOrder(root->_right);
	
}

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
    
    
	if (root == NULL)
	{
    
    
		return;
	}
	BinaryTreePostOrder(root->_left);
	BinaryTreePostOrder(root->_right);
	printf("%c ", root->_val);
}

猜你喜欢

转载自blog.csdn.net/weixin_50168448/article/details/112966775