目录
前言
什么是二叉树遍历:按照某种特定的规则,依此对二叉树的节点进行相应的操作,并且每个节点只操作一次。
提示:以下是本篇文章正文内容,下面案例可供参考
一、三种遍历方式?
对于一个二叉树而言,再遍历过程中将它们分为三种。根、左子树、右子树。常见的二叉树遍历有三种。下面就直接写好了二叉树的基本逻辑,重点是实现遍历逻辑。如果不懂可以看二叉树的初步认识这篇文章数据结构--二叉树的初步认识及堆的实现(降龙十八掌篇)-CSDN博客。遍历的实现也是比较简单的。
BTNode* BuyNode(BTDataType X)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node == NULL)
{
perror("MALLOC FAIL");
return NULL;
}
node->_data = X;
node->_left = NULL;
node->_right = NULL;
return node;
}
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
node1->_left = node2;
node1->_right = node4;
node2->_left = node3;
node4->_left = node5;
node4->_right = node6;
return node1;
}
二、遍历实现
1.前序遍历
先从根开始1开始遍历1的左子树,到2继续遍历2的左子树3到3遍历3的左子树为空那么返回继续遍历2的右子树还为空,继续向上走遍历1的右子树4之后遍历4的左子树5,5继续遍历它的左子树空,返回遍历右子树还为空,返回4遍历4的右子树6,6在遍历它的左右子树为空,至此遍历完成。就得到了 1 2 3 4 5 6。
实现逻辑就是通过递归进行实现,如果访问到空那么返回上个递归前,如果访问不为空说明有节点继续访问,由于是先访问访问的根,所以是先大于根,之后是左子树,让函数先递归左子树,递归完成在递归右子树
void PerOrder(BTNode* tree) // 前序遍历
{
if (tree == NULL)
{
printf("NULL ");
return;
}
printf("%d ", tree->_data);
PerOrder( tree->_left);
PerOrder( tree->_right);
}
2.中序遍历
中序遍历也很简单,这里要主要的是4是5和6的根所以就是,当5递归完成之后,要打印它的根也就是说,打印4之后再去寻找右子树
void InOrder(BTNode* tree) // 中序遍历
{
if (tree == NULL)
{
printf("NULL ");
return;
}
InOrder( tree->_left);
printf("%d ", tree->_data);
InOrder(tree->_right);
}
3.后序遍历
void PosOrder(BTNode* tree) // 后序遍历
{
if (tree == NULL)
{
printf("NULL ");
return;
}
PosOrder(tree->_left);
PosOrder(tree->_right);
printf("%d ", tree->_data);
}
4.练习
求一棵树节点(树中的数据)的个数
思路:利用前中后序都可以,定义一个变量,每次不为空++变量。