二叉树的遍历
Posted 小倪同学 -_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历相关的知识,希望对你有一定的参考价值。
二叉树的构建
为了方便下文对二叉树的遍历,我们先自己构建一棵二叉树
二叉树的结点
二叉树每个结点只有左右两个分支,我们可以参考链表构建一个结构体,让其有两个指针分别指向左结点,右结点。
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data; //可以根据需要改变存储数据类型
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
二叉树的初始化
先对结点初始化,再将结点赋值相连,代码如下
BTNode* BuyNode(BTDataType x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
node->data = x;
node->left = NULL;
node->right = NULL;
return node;
}
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode('A');
BTNode* node2 = BuyNode('B');
BTNode* node3 = BuyNode('C');
BTNode* node4 = BuyNode('D');
BTNode* node5 = BuyNode('E');
BTNode* node6 = BuyNode('F');
node1->left = node2;
node1->right = node3;
node2->left = node4;
node3->left = node5;
node3->right = node6;
return node1;
}
构建的二叉树如图
二叉树的前序遍历
二叉树构建好了,下面开始遍历了
前序遍历是访问根结点的操作发生在遍历其左右子树之前。即先访问它的根结点再访问它的左节点,右结点
这里需要用到递归思想,代码如下
void PreOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%c ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
下图是递归的过程,方便大家理解
运行结果
中序遍历
中序遍历是访问根结点的操作发生在遍历其左右子树之中,即先访问左结点,再访问根结点,最后再访问右结点
代码如下
void InOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
InOrder(root->left);
printf("%c ", root->data);
InOrder(root->right);
}
运行结果
后序遍历
后序遍历是访问根结点的操作发生在遍历其左右子树之后,即先访问左结点,再访问右结点,最后再访问根结点
代码如下
void PostOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%c ", root->data);
}
运行结果
层序遍历
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
如图所示
层序遍历不是利用递归而是利用队列实现,思路如下
- 将根结点入队列
- 访问时出队列,访问出队列的那个结点
- 每访问一个结点,将其左右子结点放入队列中
- 重复上述操作,直到队列为空
代码如下
void BinaryTreeLevelOrder(BTNode* root)
{
Queue q;
QueueInit(&q);
if (root)
{
QueuePush(&q, root);
}
while (!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
printf("%c ", front->data);
if (front->left)
{
QueuePush(&q, front->left);
}
if (front->right)
{
QueuePush(&q, front->right);
}
}
printf("\\n");
QueueDestroy(&q);
}
上述代码用到了队列的函数,可以参考博主之前写的文章数据结构之队列
运行结果
以上是关于二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章