二叉树的建立

这篇博客详细介绍了如何通过前序遍历的数组构建二叉树,并提供了包括前序、中序、后序遍历在内的多种操作方法。此外,还涵盖了计算节点个数、树的高度、叶子节点个数、指定层级节点个数、查找特定值的节点以及销毁二叉树等功能的实现。
摘要由CSDN通过智能技术生成

二叉树的建立

例:

通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef struct BNode
{
	struct BNode* _left;
	struct BNode* _right;
	DataType _data;
}Node;
Node* creatBinaryTree(DataType arr[], int* idx)
{
	if (arr[*idx] == '#')
	{
		(*idx)++;
		return NULL;
	}
	Node* root = (Node*)malloc(sizeof(Node));
	// 根左右
	root->_data = arr[*idx];
	(*idx)++;
	root->_left = creatBinaryTree(arr, idx);
	root->_right = creatBinaryTree(arr, idx);
	return root;
}
//前序遍历
void preOrder(Node* root)
{
	if (root)
	{
		//根 左 右
		printf("%c\n", root->_data);
		preOrder(root->_left);
		preOrder(root->_right);
	}
}
//中序遍历
void inOrder(Node* root)
{
	if (root)
	{
		//左 根 右
		inOrder(root->_left);
		printf("%c\n", root->_data);
		inOrder(root->_right);

	}
}
//后序遍历
void postOrder(Node* root)
{
	if (root)
	{
		//左 右 根
		postOrder(root->_left);
		postOrder(root->_right);
		printf("%c\n", root->_data);

	}
}
//求节点个数
//如果是空树,则节点个数为0
//节点个数为左子树的节点个数+右子树的节点个数+1
int bTreesize(Node* root)
{
	if (root == NULL)
		return 0;
//左节点个数+右节点个数+1
	return bTreesize(root->_left) + bTreesize(root->_right) + 1;
}
//求树的高度
int bTreeHeight(Node* root)
{
	if (root == NULL)
		return 0;
	int left = bTreeHeight(root->_left);
	int right = bTreeHeight(root->_right);
	//高度=max(左右子树高)+1
	return left > right ? left + 1 : right + 1;
}
//求叶子结点个数
//空节点:0个
//叶子结点:1个
//非叶子节点:左+右
int bTreeLeafsize(Node* root)
{
	//空树
	if (root == NULL)
		return 0;
	//叶子结点
	if (root->_left == NULL && root->_right == NULL)
	{
		return 1;
	}
	//非叶子节点
	return bTreeLeafsize(root->_left) + bTreeLeafsize(root->_right);
}
//求k层节点个数
//第k层节点个数=左右子树第k-1层的和
int bTreekSize(Node* root, int k)
{
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return bTreekSize(root->_left, k - 1) + bTreekSize(root->_right, k - 1);
}
//二叉树查找值为x的点
Node* bTreeFind(Node* root, char ch)
{
	if (root)
	{
		if (root->_data == ch)
			return root;//查找是否为根节点
		Node* node = bTreeFind(root->_left, ch);
		if (node)//查找是否为左子数
			return node;
		else
			return bTreeFind(root->_right, ch);//如果不是左子树则为右子树

	}
	
	return NULL;//为空树
}
//二叉树销毁
void bTreeDestory(Node** root)
{
	if (*root)
	{
		bTreeDestory(&((*root)->_left));
		bTreeDestory(&((*root)->_right));
		free(*root);
		root = NULL;

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值