1 二叉链表的创建
也称链式二叉树


我们可以实现一个这样的二叉树

经过调试我们可以看到确实是我们的期望的样子

2 二叉树的遍历
想必大家有点怀疑这个二叉树的遍历是什么东西 , 下面给大家来了解一下
1) 先根遍历
在排序的时候是根据 根结点 在前 左右孩子顺序 --------------也可以理解为 根 左 右
知道这样理解大家还是不会明白 我举一个例子 就由上面我们实现的

代码如下

我们来看看是不是和我们开始预期的一样

大家还记得在前面c语言中讲到的递归吗?
二叉树就是遵循递归的规律 下面我给大家画一下。

2)中根遍历
中根就是把根节点放在左右孩子的中间 ------------------ 左 根 右

中根遍历的代码也是递归的

代码也是和前根类似


3)后根遍历
后根就是把根根结点放最后面 ------------------------- 左 右 根

遇事不决,可问春风,春风不语 ,既随本心。



4)二叉树中的结点个数
大概的图是这样的。



5)二叉树中叶子结点的个数
叶子结点就是 :左右子树都为空的点 也称度为0的节点

下面代码可以这样写

这里打印出叶子节点是3个

6)二叉树第看k层的节点个数

第三层得出是两个节点
由上面我们可以得出当k=1层是就是该层 ,


得出的结果和我们分析的一样
7)二叉树的深度/高度
高度是根据左子树 或者右子树上哪个层次高来决定的



8)在二叉树中找值为x的 节点

废话不多说看代码


结果和我们预期一样
9)二叉树的销毁



下面是二叉树的代码
text.c
cpp
#include "Tree.h"
BTNode* BuyNode(BTDatatype x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node == NULL)
{
perror("malloc fail");
exit(1);
}
node->data = x;
node->leftchild = node->rightchild = NULL;
return node;
}
void text01()
{
//创建节点
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
//将节点都链接起来
node1->leftchild = node2;
node1->rightchild = node3;
node2->leftchild = node4;
node2->rightchild = node5;
/*PreOrder(node1);
printf("\n");*/
INOrder(node1);
printf("\n");
PostOrder(node1);
printf("\n");
//printf("size %d\n", BinaryTreeSize(node1));
/*printf("leafsize %d\n", BinaryTreeleafSize(node1));
printf("Ksize %d\n",BinaryTreeLevelKSize(node1, 3));*/
//printf("depth %d\n", BinaryTreeDepth(node1));
BTNode* find = BinaryTreeFind(node1, 8);
if (find == NULL)
{
printf("没找到\n");
}
else
printf("找到了\n");
BinaryTreeDestory(&node1);
}
int main()
{
text01();
return 0;
}
BinaryTree.c
cpp
#include "Tree.h"
void PreOrder( BTNode * root)
{
if (root == NULL)
{
return;
}
printf("%d ", root->data);
PreOrder(root->leftchild);
PreOrder(root->rightchild);
}
void INOrder( BTNode * root)
{
if (root == NULL)
{
return;
}
INOrder(root->leftchild);
printf("%d ", root->data);
INOrder(root->rightchild);
}
void PostOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
PostOrder(root->leftchild);
PostOrder(root->rightchild);
printf("%d ", root->data);
}
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
return BinaryTreeSize(root->leftchild) + BinaryTreeSize(root->rightchild) + 1;
}
int BinaryTreeleafSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
if (root->leftchild == NULL && root->rightchild == NULL)//判断是不是叶子结点
{
return 1;
}
return BinaryTreeleafSize(root->leftchild) + BinaryTreeleafSize(root->rightchild);//遍历左右子树
}
int BinaryTreeLevelKSize(BTNode* root,int k )
{
if (root == NULL)
{
return 0;
}
if (k == 1)//k等于1的时候代表k就是第几行
{
return 1;
}
//每一次调用 k都要减一
return BinaryTreeLevelKSize(root->leftchild,k-1) + BinaryTreeLevelKSize(root->rightchild,k-1);
}
int BinaryTreeDepth(BTNode* root)
{
if (root == NULL)
{
return 0;
}
//遍历左子树
int leftdep = BinaryTreeDepth(root->leftchild);
int rightdep = BinaryTreeDepth(root->rightchild);
//如果是左子树大 那么就返回左子树+1 ,右子树大返回右子树+1
return leftdep > rightdep ? leftdep + 1 : rightdep + 1;
}
BTNode * BinaryTreeFind(BTNode* root, BTDatatype x)
{
if (root == NULL)
{
return NULL;
}
if (root->data== x)
{
return root;
}
BTNode * leftfind= BinaryTreeFind(root->leftchild, x);
if (leftfind)//左子树不为空
{
return leftfind;
}
BTNode * rightfind = BinaryTreeFind(root->rightchild, x);
if (rightfind)//右子树不为空
{
return rightfind;
}
//走到这里就是没有找到
return NULL;
}
void BinaryTreeDestory(BTNode** root)
{
if (*root == NULL)
{
return;
}
//这里的(*root)->leftchild 是一级指针 我们的root 的参数是二级指针 这里也就是穿一级指针的地址
BinaryTreeDestory(&((*root)->leftchild));
BinaryTreeDestory(&((*root)->rightchild));
free(*root);
*root = NULL;
}
BinaryTree.h
cpp
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
//定义二叉树结构
typedef int BTDatatype;
typedef struct BinaryTreeNode
{
BTDatatype data;
struct BinaryTreeNode* leftchild;
struct BinaryTreeNode* rightchild;
} BTNode;
//先序遍历
void PreOrder(BTNode* root);
//中跟遍历
void INOrder(BTNode* root);
//后跟遍历
void PostOrder(BTNode* root);
//二叉树中结点的个数
int BinaryTreeSize(BTNode * root);
//二叉树叶子节点个数
int BinaryTreeleafSize(BTNode * root);
//二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root ,int k);
//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root);
//二叉树找值为x的节点
BTNode * BinaryTreeFind(BTNode* root, BTDatatype x);
//二叉树的销毁
void BinaryTreeDestory(BTNode** root);