这, 是一棵二叉树,你想访问它的节点,就要用到二叉树的遍历
二叉树的遍历,可分为深度优先和广度优先,先来说说深度优先:
二叉树的深度优先遍历,分为前序,中序和后序遍历,以前序遍历为例,访问顺序为:根—左—右,即先访问根结点的数据,再访问左子树和右子树的数据,具体逻辑如下图:
相应地,后序和中序的访问顺序分别为:左-右-中,左-中-右,深度优先遍历的具体代码如下注意要用到递归的知识:
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
printf("%c ",root->_data);
BinaryTreePrevOrder(root->_left);
BinaryTreePrevOrder(root->_right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreeInOrder(root->_left);
printf("%c ", root->_data);
BinaryTreeInOrder(root->_left);
}
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreePostOrder(root->_left);
BinaryTreePostOrder(root->_right);
printf("%c ",root->_data);
}
然后就是二叉树的广度优先遍历,也就是层序遍历,就是一层一层地遍历,以本文给的二叉树为例,第一层为0,第二层为1,2,第三层为3,4,5,6,那么总体的遍历结果为:0,1,2,3,4,5,6,其实现要用到队列的数据结构,将根结点压入队列,出来时将左右子树也压入队列,子树为空不压,直到队列为空为止,具体代码如下:
// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
Queque* index = (Queque*)malloc(sizeof (Queque));
InitQue(index);
PushQue(index,root);
while (index->size != 0)
{
BTNode* check = QueTop(index);
PopQue(index);
printf("%c ",check->_data);
if (check->_left != NULL)
{
PushQue(index,check->_left);
}
if (check->_right != NULL)
{
PushQue(index,check->_right);
}
}
DestoryQue(index);
}