二叉树基本操作

定义结构体:

typedef int BTDatatype;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode *left;
	struct BinaryTreeNode *right;
	BTDatatype data;
}BTNode;

前序构建二叉树的结点;

前序遍历二叉树;

中序遍历二叉树;

后序遍历二叉树;

求二叉树的结点,叶子节点,第K层结点数,查找结点,树的深度。

对于上列问题,都可以用递归求解,因为一棵非空二叉树都有一个根,一个左子树,一个右子树。对于这种特性,可以将问题化为子问题。

前序遍历二叉树画图说明:


代码如下:

int BTreeDepth(BTNode *root)//求树的深度
{
	if (root == NULL)
		return 0;
	//将问题化为子问题,求树的高度也就是求左子树高度和右子树高度最大值
	if (BTreeDepth(root->left) > BTreeDepth(root->right))
		return  BTreeDepth(root->left)+1;
	else   //如果相等,也可以返回右子树高度
		return  BTreeDepth(root->right)+1;
}
BTNode *BTreeFind2(BTNode *root, BTDatatype x)//查找结点
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;
	BTNode *ret = NULL;
	ret = BTreeFind2(root->left, x);
	if (ret)//在左边找到,就不用在右结点找,直接返回
		return ret;
	//在左边没有找到
	ret= BTreeFind2(root->right, x);
	if (ret)//在右边找到
		return ret;
	else   //如果在一颗树的右边没有找到,那这棵树就没有该节点,就可以返回
		return NULL;
}
BTNode *ret = NULL;
BTNode *BTreeFind1(BTNode *root, BTDatatype x)//查找结点
{
	if ((root) == NULL)
		return NULL ;
	if (root->data == x)
		 ret=root;
	//查找左子树和右字树
	else {
		BTreeFind1(root->left,x);
		BTreeFind1(root->right, x);
	}
	return ret;
}
int BTreeKLevelsize(BTNode *root, int k)//求第k层结点数
{
	//求解二叉树第K层节点数目,使用递归解法,
	//第k层的节点数 = 第k - 1层左孩子节点数 + 第k - 1层右孩子节点数目,
	//直到k == 1时,说明已经到了第K层。
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return  BTreeKLevelsize(root->left, k -1) + BTreeKLevelsize(root->right, k - 1);
}
int BTtreeLeafSize(BTNode *root)//树叶子结点数
{
	if (root == NULL)
		return 0;
	if (root->left == NULL&&root->right == NULL)
		return 1;
	return BTtreeLeafSize(root->left) + BTtreeLeafSize(root->right);
}

int  BTtreeSize(BTNode *root)//树一共结点数
{//将问题化为子问题,结点数等于1+左子树结点数+右子树结点数
	if (root == NULL)
		return 0;
	return 1 + BTtreeSize(root->left) + BTtreeSize(root->right);
}
void BTtreePostOreder(BTNode *root)//后根遍历
{
	if (root)
	{
		BTtreePostOreder(root->left);
		BTtreePostOreder(root->right);
		printf("%d ", root->data);
	}
	return;
}
void BTtreeInOreder(BTNode *root)//中根遍历
{
	if (root)
	{
		BTtreeInOreder(root->left);
		printf("%d ", root->data);
		BTtreeInOreder(root->right);
	}
	return;
}
void BTtreePrevOreder(BTNode *root)//前序遍历
{
	if (root)
	{
		printf("%d ", root->data);
		BTtreePrevOreder(root->left);
		BTtreePrevOreder(root->right);
	}
	return;
}
BTNode *BuyBTNode(BTDatatype x)//构建树的结点
{
	BTNode *tree = (BTNode *)malloc(sizeof(BTNode));
	tree->data = x;
	tree->left = NULL;
	tree->right = NULL;
	return tree;
}
BTNode *CreateBTTree(BTDatatype *a, int sz, int *pIndex, BTDatatype invalid)
{//invalid代表表示空的字符
	assert(a);
	BTNode *root = NULL;
	if ((*pIndex) < sz)
	{
		if (a[*pIndex] != invalid)
		{
			root = BuyBTNode(a[*pIndex]);
			(*pIndex)++;
			root->left = CreateBTTree(a, sz, pIndex, invalid);
			(*pIndex)++;
			root->right = CreateBTTree(a, sz, pIndex, invalid);
		}
	}
	return root;
}
void TestBinaryTree(){
	BTNode *root = NULL;
	BTDatatype a[] = { 1,2,3,'#',4,'#','#',5,6,'#','#','#' };
	int pIndex = 0;
	int sz = sizeof(a) / sizeof(a[0]);
	root = CreateBTTree(a, sz, &pIndex, '#');
	BTtreePrevOreder(root);//前序
	printf("\n");
	BTtreeInOreder(root);//中序
	printf("\n");
	BTtreePostOreder(root);//后序
	printf("\n");
	printf("树的结点数:%d\n", BTtreeSize(root));//树的结点数
	printf("树的叶子结点数:%d\n", BTtreeLeafSize(root));//树叶子结点数
	int k = 4;
	printf("第%d层结点数:%d\n", k,BTreeKLevelsize(root, k));//求第k层结点数
	printf("%d\n", BTreeFind1(root, 6)->data);//查找结点
	printf("%d\n", BTreeFind2(root, 3)->data);//查找结点
	printf("%d\n", BTreeFind2(root, 4)->data);//查找结点
	printf("树的高度:%d\n",BTreeDepth(root));}








猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/80029952