目录
1.二叉树的链式结构
typedef int BTDataType;
typedef struct BinaryTreeNode
{
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
BTDataType data;
}BTNode;
2.二叉树的遍历
2.1先序遍历
void PrevOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL");
return;
}
printf("%c", root->data);
PrevOrder(root->left);
PrevOrder(root->right);
}
2.2中序遍历
void InOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL");
return;
}
InOrder(root->left);
printf("%c", root->data);
InOrder(root->right);
}
2.3后序遍历
void PostOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL");
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%c", root->data);
}
3.二叉树的基本操作
3.1求二叉树结点个数
3.1.1全局遍历
1、全局
int size = 0;//这里不妨思考下能不能直接放入BinaryTreeSize函数内部进行定义
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
{
return;
}
else
{
++size;
}
BinaryTreeSize(root->left);
BinaryTreeSize(root->right);
}
3.1.2递归的思想分治
用递归的思想分治,计算二叉树的结点数量,可以认为
数量 = 1 + 左子树数量 + 右子树数量
,其中1是当前根结点数量
int TreeSize(BTNode* root)
{
return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;//此处的1是自身结点
}
3.1.3局部变量
2、遍历 -- 局部变量
void BinaryTreeSize(BTNode* root, int* psize)
{
if (root == NULL)
return;
else
++(*psize);
BinaryTreeSize(root->left, psize);
BinaryTreeSize(root->right, psize);
}
3.2求二叉树叶子结点个数
按照递归思想,计算二叉树的叶子结点数量,我们可以认为
数量等于 = 0 + 左子树叶子结点数量 + 右子树叶子结点数量
,0是因为当前根结点有子树,说明根结点不是叶子结点.
//求叶子结点的个数->运用分治的思想
int TreeLeafSize(BTNode* root)
{
//1 空 reutrn0
//2叶子 return 1
//非空且不是叶子 return左子树的叶子结点个数+右子树的叶子结点个数
if (root == NULL)
{
return 0;
}
if (root->left == NULL && root->right == NULL)
{
return 1;
}
return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}
3.3求二叉树第K层结点个数
核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层
//给的K是几就给出第K层
//思路:求第K层即为求左子树的第K-1层和右子树的第K-1层
int TreeKLeveLSize(BTNode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
return 1;
return TreeKLeveLSize(root->left, k - 1) + TreeKLeveLSize(root->right, k - 1);
}
3.4求二叉树的深度/高度
二叉树的高度等于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;
}
3.5查找二叉树中值为x的结点
/*1.root == NULL
2.root结点不是要找的,先到左树去找,左树没有再到右树去找
3.左右都没有,当前树没有找到返回NULL*/
BTNode* TreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return NULL;
}
if(root->data == x)
{
return root;
}
BTNode*lret = TreeFind(root->left, x);
if (lret)
{
return lret;
}
BTNode* rret = TreeFind(root->right, x);
if (rret)
{
return rret;
}
//左边右边都没有找到
return NULL;
}
3.6二叉树的销毁
二叉树的销毁->采用后续销毁
前中后都是递归返回顺序,处理根的顺序不一样
如果使用一级指针,存在野指针问题,调用BinaryTreeDestory的人,把指针置空
使用一级指针以保持接口的一致性
void BinaryTreeDestory(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreeDestory(root->left);
BinaryTreeDestory(root->right);
free(root);
root = NULL;
}
3.7运用队列实现广度优先的层序遍历
void TreeLevelOrder(BTNode* root)
{
Queue q;
QueueInit(&q);
if (root)
{
QueuePush(&q, root);
}
while (!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
printf("%c", front->data);
if (front->left)
{
QueuePush(&q, front->left);
}
if (front->right)
{
QueuePush(&q, front->right);
}
}
QueueDestory();
}