二叉树的特点:
- 每个结点最多有两个子树,二叉树不存在度大于2的结点
- 二叉树的子树有左、右之分,其子树的次序不能颠倒。
任何一个二叉树有三个部分:1、根节点,2、左子树,3、右子树
遍历方法:前、中、后序
1、前序:根 -->左子树 -->右子树
能确定一颗树的根
2、中序:左子树 --> 根 --> 右子树
后序:左子树 --> 右子树 --> 根
#include <stdlib.h>
#include <stdio.h>
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char data;
};
typedef struct TreeNode BTNode;
void PrevOrder(BTNode* root) //前序
{
if (root == NULL)
{
printf("NULL ");
return 0;
}
printf("%c ",root->data); //根
PrevOrder(root->left); //左子树
PrevOrder(root->right); //右子树
}
void InOrder(BTNode* root) //中序
{
if (root == NULL)
{
printf("NULL ");
return 0;
}
InOrder(root->left); //左子树
printf("%c ", root->data); //根
InOrder(root->right); //右子树
}
void PostOrder(BTNode* root) //后序
{
if (root == NULL)
{
printf("NULL ");
return 0;
}
PostOrder(root->left); //左子树
PostOrder(root->right); //右子树
printf("%c ", root->data); //根
}
void TreeSize(BTNode* root, int* psize) //求数结点的个数
{
if (root == NULL)
{
return;
}
else
{
(*psize)++;
}
TreeSize(root->left,psize);
TreeSize(root->right,psize);
}
int LeafSize(BTNode* root) //求叶子结点
{
if (root == NULL) //自己为空
return 0;
if (root->left == NULL&&root->right == NULL) //自己是叶子
return 1;
else //自己是根
return LeafSize(root->left) + LeafSize(root->right);
}
int main()
{
BTNode* A = (BTNode*)malloc(sizeof(BTNode));
A->data = 'A';
A->left = NULL;
A->right = NULL;
BTNode* B = (BTNode*)malloc(sizeof(BTNode));
B->data = 'B';
B->left = NULL;
B->right = NULL;
BTNode* C = (BTNode*)malloc(sizeof(BTNode));
C->data = 'C';
C->left = NULL;
C->right = NULL;
BTNode* D = (BTNode*)malloc(sizeof(BTNode));
D->data = 'D';
D->left = NULL;
D->right = NULL;
BTNode* E = (BTNode*)malloc(sizeof(BTNode));
E->data = 'E';
E->left = NULL;
E->right = NULL;
A->left = B;
A->right = C;
B->left = D;
B->right = E;
PrevOrder(A);
printf(" 前序\n");
InOrder(A);
printf(" 中序\n");
PostOrder(A);
printf(" 后序\n");
int Asize = 0;
TreeSize(A,&Asize);
printf("TreeSize= %d\n",Asize);
int Bsize = 0;
TreeSize(B,&Bsize);
printf("TreeSize= %d\n", Bsize);
return 0;
}