二叉树实现
结构体创建
核心逻辑:
定义了二叉树的基本结构 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 | 构建树、调用遍历函数测试 |