1.链式实现
1.1定义结构
cpp
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
1.2创建⼀棵链式⼆叉树
cpp
BTNode* BuyNode(char x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
node->data = x;
node->left = node->right = NULL;
return node;
}
BTNode* createBinaryTree()
{
BTNode* n1 = BuyNode('A');
BTNode* n2 = BuyNode('B');
BTNode* n3 = BuyNode('C');
BTNode* n4 = BuyNode('D');
BTNode* n5 = BuyNode('E');
BTNode* n6 = BuyNode('F');
n1->left = n2;
n1->right = n3;
n2->left = n4;
n4->left = n5;
n4->right = n6;
return n1;
}
1.3前中后序遍历
1.3.1遍历规则
照规则,⼆叉树的遍历有:前序/中序/后序的递归结构遍历:
1)前序遍历:访问根结点的操作发⽣在遍历其左右⼦树之前
访问顺序为:根结点、左⼦树、右⼦树
2)中序遍历:访问根结点的操作发⽣在遍历其左右⼦树之中(间
访问顺序为:左⼦树、根结点、右⼦树
3)后序遍历:访问根结点的操作发⽣在遍历其左右⼦树之后
访问顺序为:左⼦树、右⼦树、根结点
前序遍历:
cpp
void preOrder(BTNode* root)
{
if(root==NULL)
{
printf("NULL ");
return;
}
printf("%c ",root->data);
preOrder(root->left);
preOrder(root->right);
}
中序遍历:
cpp
void inorder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
inOrder(root->left);
printf("%c ",root->data);
inOrder(root->right);
}
后序遍历:
cpp
void postOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%c ", root->data);
}

1.4⼆叉树结点个数 =根节点数+左叉树+右叉树
cpp
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
return 1+BinaryTreeSize(root->left)+BinaryTreeSize(root->right);
}
1.5⼆叉树叶⼦结点个数
cpp
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);
1.6⼆叉树第k层结点个数
cpp
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);
1.7⼆叉树的深度/⾼度
cpp
int BinaryTreeDepth(BTNode* root)
{
if (root == NULL)
{
return 0;
}
int leftDep=BinaryTreeDepth(root->left);
int rightDep=BinaryTreeDepth(root->right);
return 1+(leftDep>rightDep?leftDep:rightDep);
}
1.8⼆叉树查找值为x的结点
cpp
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return;
}
if(root->data==x)
{
return root;
}
BTNode*leftFind=BinaryTreeFind(root->left,x);
if(leftFind)
return leftFind;
BTNode*rightFind=BinaryTreeFind(root->right,x);
if(rightFind)
return rightFind;
return NULL;
}
1.9⼆叉树销毁
cpp
void BinaryTreeDestory(BTNode** root)
{
if(*root==NULL)
{
return;
}
BinaryTreeDestory((*root)->left);
BinaryTreeDestory((*root)->right);
free(*root);
*root=NULL;
}
1.10层序遍历
层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2 层上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程
实现层序遍历需要额外借助数据结构:队列
cpp
void levelOrder(BTNode* root)
{
//定义队列....
//创建和初始化队列
Queue q;
QueueInit(&q);
QueuePush(&q, root);//入队列
while (!QueueEmpty(&q))
{
BTNode* top = QueueFront(&q);//取队顶
QueuePop(&q);//出队
printf("%c ", top->data);
if (top->left)
QueuePush(&q, top->left);
if (top->right)
QueuePush(&q, top->right);
}
QueueDestroy(&q);
}
2.二叉树性质

给出中序遍历和前/后遍历可以确定一个二叉树结构