定义
之前四篇博客分别介绍了线性结构中的顺序表、链表、栈、队列。从难度来讲,顺序表到链表是递增的。从实现来讲,栈和队列基于顺序表和链表(之前栈采用了顺序表的存储结构,队列采用了链表的存储结构)。此次介绍的二叉树虽是非线性结构的树形结构分支,但在其各个结点遍历的实现上,使用到了栈和队列的特性。
二叉树是一种特殊的线性结构,每个结点最多只有两个分支,称左孩子结点和右孩子结点。更多关于二叉树的特性,自行查阅资料。接下来只详细的介绍创建二叉树以及二叉树的遍历。
实现
定义结构
typedef char TreeType;
typedef struct BitNode {
TreeType key;
struct BitNode *left;
struct BitNode *right;
} BitTree;
二叉树的结构和双向链表的结构一致,只是双向链表的两个指针构成线性结构,二叉树的两个指针构成非线性结构。
定义操作
构造空二叉树
/**
* 构造空二叉树
*/
void initBitTree(BitTree& root) {
root.left = NULL;
root.right = NULL;
}
将根结点的左右两个指针置空。
创建二叉树
/**
* 创建二叉树(按照前序遍历方式构建二叉树)
*/
void createBitTree(BitTree** parent) {
char key = getchar();
getchar();
if (key == '#') { //输入#表示该节点是叶子节点
*parent = NULL;
return;
} else {
*parent = (BitTree*) malloc(sizeof(BitTree));
if (*parent == NULL)
exit(9);
(*parent)->key = key;
createBitTree(&((*parent)->left));
createBitTree(&((*parent)->right));
}
}
先序遍历的方式构建二叉树,输入#号表示当前结点的左孩子结点或右孩子结点为空。
递归先序遍历
/**
* 递归先序遍历
*/
void preOrderTraverse(BitTree* parent) {
if (parent != NULL) {
visit(*parent);
preOrderTraverse(parent->left);