【数据结构】交换二叉树每个结点的左右子节点+计算二叉树的最大宽度等实现(C语言)

一.前序、中序、后序遍历

#include
#include
#include

typedef char BTDataType;

typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;

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

	printf("%c ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

//二叉树中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%c ", root->data);
	InOrder(root->right);
}

//二叉树后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%c ", root->data);
}

二.

//二叉树节点个数

int BinaryTreeSize(BTNode* root)
{
	return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

三.二叉树叶子结点个数

//二叉树叶子结点的个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return (root->left == NULL && root->right == NULL) ? 1 : 
		BinaryTreeLeafSize(root->left)
		+ BinaryTreeLeafSize(root->right);
}

四.二叉树第k层节点个数

//二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
	{
		return 0;
	}

	

	if (k == 1)
	{
		return 1;
	}

	return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
	
}

五.二叉树深度/高度

//二叉树深度/高度
int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftDepth = BinaryTreeDepth(root->left);
	int rightDepth = BinaryTreeDepth(root->right);

	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

六.二叉树查找值为x的节点

//二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}

	if (root->data == x)
	{
		return root;
	}

	BTNode* leftRet = BinaryTreeFind(root->left, x);
	if (leftRet)
	{
		return leftRet;
	}
	BTNode* rightRet = BinaryTreeFind(root->right, x);
	if (rightRet)
	{
		return rightRet;
	}

	return NULL;
}

七.交换二叉树每个结点的左孩子和右孩子

//交换二叉树每个结点的左孩子和右孩子

//交换一次
void ExchangeOnce(BTNode** root)
{
	BTNode* tmp = (*root)->left;
	(*root)->left = (*root)->right;
	(*root)->right = tmp;
}
void ExchangeLRChild(BTNode** root)
{
	assert(root);
	if ((*root)->left == NULL && (*root)->right == NULL)
	{
		return;
	}
	else
	{
		ExchangeOnce(root);
	}
	return ExchangeLRChild(&((*root)->left));
	return ExchangeLRChild(&((*root)->right));
}

八.计算二叉树的最大宽度

//计算二叉树的最大宽度
int BinaryTreeWidthMax(BTNode* root)
{
	assert(root);
	int depth = BinaryTreeDepth(root);
	int i = 1;
	int max = 1;
	while (i <= depth)
	{
		int tmp = BinaryTreeLevelKSize(root, i);
		if (tmp > max)
		{
			max = tmp;
		}
		i++;
	}
	return max;
}

你可能感兴趣的:(C语言,数据结构,数据结构,c语言,算法)