结构体创建
核心逻辑 :
定义了二叉树的基本结构 TreeNode
,每个节点包含一个字符型数据 data
,以及指向左右子树的指针 left
和 right
。
typedef char DataType;
typedef struct BiTNode
{
DataType data;
struct BiTNode *left;
struct BiTNode *right;
} TreeNode;
树的创建(前序构造)
核心逻辑 :
利用前序遍历方式,根据字符数组构造二叉树。遇到 #
表示该节点为空(空子树)。递归构造左右子树。
DataType data[] = "Abd#g###ce#h##fi###";
int ind = 0;
void CreatTree(TreeNode **tree)
{
char c = data[ind++];
if (c == '#')
{
*tree = NULL;
return;
}
else
{
*tree = malloc(sizeof(TreeNode));
if (*tree == NULL)
{
printf("malloc tree error\n");
return;
}
(*tree)->data = c;
CreatTree(&(*tree)->left);
CreatTree(&(*tree)->right);
}
}
三种遍历函数
核心逻辑:
前序遍历(根-左-右):先访问当前节点,再访问左子树和右子树。
中序遍历(左-根-右):先访问左子树,再访问当前节点,最后访问右子树。
后序遍历(左-右-根):先访问左子树和右子树,最后访问当前节点。
void PreOrderTraverse(TreeNode *tree)
{
if (tree == NULL) return;
printf("%c", tree->data);
PreOrderTraverse(tree->left);
PreOrderTraverse(tree->right);
}
void InoderderTraverse(TreeNode *tree)
{
if (tree == NULL) return;
InoderderTraverse(tree->left);
printf("%c", tree->data);
InoderderTraverse(tree->right);
}
void PosederTraverse(TreeNode *tree)
{
if (tree == NULL) return;
PosederTraverse(tree->left);
PosederTraverse(tree->right);
printf("%c", tree->data);
}
层序遍历函数 ShowTree
核心逻辑:
通过辅助队列 lqe
进行层序遍历,从上至下、从左至右访问每一个节点。队列中维护每层的节点顺序,每次出队一个节点,就将其左右子节点(如果存在)入队,直到队列为空
模块 | 函数名 | 功能说明 |
---|---|---|
节点结构 | TreeNode |
定义二叉树节点数据结构 |
树构建 | CreatTree |
递归前序方式构建二叉树(支持空节点) |
前序遍历 | PreOrderTraverse |
根 -> 左 -> 右 |
中序遍历 | InoderderTraverse |
左 -> 根 -> 右 |
后序遍历 | PosederTraverse |
左 -> 右 -> 根 |
层序遍历 | ShowTree |
借助队列按层输出节点内容 |
主程序入口 | main |
构建树、调用遍历函数测试 |