二叉树基本操作(一)

目录

一、二叉树的概念

二、二叉树的分类

 满二叉树 && 完全二叉树

三、二叉树的基本操作

1、二叉树的创建

2、二叉树的销毁

3、求二叉树的高度  

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

5、求二叉树结点的个数

6、求二叉树第 K 层结点的个数  

7、判断一个节点是否在一棵二叉树中  


注:完整代码请至 Github 查看:https://github.com/lxt-cn/DSCode/tree/master/BinaryTree

 


一、二叉树的概念

      二叉树,顾名思义,就是每个节点最多有两个分支。因此,我们总结二叉树的特点:1)每个节点最多有两颗树;2)二叉树的子树有左右之分,其子树次序不能颠倒。

     如下图所示,二叉树可看做以下 5 种形式组合或嵌套形成:

                 

二、二叉树的分类

 满二叉树 && 完全二叉树

满二叉树:在一个二叉树中,所有分支节点都存在左右子树,并且所有叶子节点都在同一层上,则为满二叉树。

完全二叉树:在一个二叉树中,它的前 N 个节点的结构与满二叉树的前 N 个节点的结构相同,则为完全二叉树。

     如下图所示为满二叉树与完全二叉树的基本结构图:

                     

三、二叉树的基本操作

节点定义:以下的基本操作中,我们使用孩子表示法,即节点包含左右孩子及节点元素。

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType _data;
	struct BinaryTreeNode* _left;
	struct BinaryTreeNode* _right;
}BTNode;

1、二叉树的创建

      a 是一个前序遍历的数组,下面的二叉树的建立,我们采用前序的方式建立。

static BTNode* BuyBTNode(BTDataType d)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	node->_data = d;
	node->_left = NULL;
	node->_right = NULL;
	return node;
}

BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{
	if (a[*pi] != '#')
	{
		BTNode* root = BuyBTNode(a[*pi]);
		
		++(*pi);
		root->_left = BinaryTreeCreate(a, n, pi);
		
		++(*pi);
		root->_right = BinaryTreeCreate(a, n, pi);
		
		return root;
	}
	else
	{
		return NULL;
	}
}

 

2、二叉树的销毁

void BinaryTreeDestory(BTNode** pptree)
{
	BTNode* root = *pptree;
	if (root == NULL)
		return;

	BinaryTreeDestory(&root->_left);
	BinaryTreeDestory(&root->_right);
	free(root);
	*pptree = NULL;
}

 

3、求二叉树的高度  

int BinaryTreeHeight(BTNode* root)
{
	int leftHeight = 0;
	int rightHeight = 0;
	if (root == NULL)
		return 0;

	leftHeight = BinaryTreeHeight(root->_left);
	rightHeight = BinaryTreeHeight(root->_right);

	return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
}

 

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

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);
}

 

5、求二叉树结点的个数

int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return 1 + BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right);
}

 

6、求二叉树第 K 层结点的个数  

int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return BinaryTreeLevelKSize(root->_left, k - 1) + BinaryTreeLevelKSize(root->_right, k - 1);
}

 

7、判断一个节点是否在一棵二叉树中  

BTNode* BinaryTreeFind(BTNode* root, BTDataType d)
{
	BTNode* ret = NULL;
	if (root == NULL || root->_data == d)
		return root;

	ret = BinaryTreeFind(root->_left, d);
	if(ret == NULL)
    	ret = BinaryTreeFind(root->_right, d);
	return ret;

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值