目录
注:完整代码请至 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;
}