二叉链
二叉链是链式结构的一种用链表来表示一棵二叉树,即用链来指示元素的逻辑关系,链表中每个结点由三个域组成,数据域和左右指针域,左指针指向该节点的左孩子,右指针指向该节点的右孩子。
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data; //数据域
struct BinaryTreeNode* left; //指向左孩子
struct BinaryTreeNode* right; //指向右孩子
}BTNode;
二叉树的遍历
所谓二叉树遍历是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。
二叉树的遍历有以下4种方式
前序遍历:先遍历根、在遍历左子树、最后在遍历右子树
// 二叉树前序遍历: 根、左子树、右子树
void PreOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%d ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
中序遍历:先遍历左子树、在遍历根、最后在遍历右子树
// 二叉树中序遍历: 左子树、根、右子树
void InOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
InOrder(root->left);
printf("%d ", root->data);
InOrder(root->right);
}
后序遍历:先遍历左子树、在遍历右子树、最后在遍历根
// 二叉树后序遍历: 左子树、右子树、根
void PostOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%d ", root->data);
}
层序遍历:一层一层的遍历
/ 层序遍历 --- 队列实现
//先入根节点,在出根结点,如果根节点的左右子树都不为空就入队列
void LevelOrder(BTNode* root)
{
Queue q;
QueueInit(&q);
//将根节点入队列
if (root != NULL)
{
QueuePush(&q, root);
}
while (!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
//出层序数据
printf("%d ", front->data);
//左右子树判空
if (front->left != NULL)
{
QueuePush(&q, front->left);
}
if (front->right != NULL)
{
QueuePush(&q, front->right);
}
}
QueueDestroy(&q);
}