引子:二叉树有着广泛的应用,而二叉树的遍历是很重要的,其中包括(前,中,后,层序遍历);什么是二叉树的前,中,后,层序?
问题:什么是二叉树的前,中,后,层序?
解释:
前序是“根左右”
中序是“左根右”
后序是“左右根”
层序是“一层一层,从上到下”
注意:前序有许有多种情况,但是可能是一样的排序,包括中后一样!
图解:
如下是一个数的前中后序层序遍历:
代码实现:
次重点:
首先,我们先创建一个树:(在这里我简单给个数组来存储一个数上的节点数据)
char a={ a,b,c,#,#,d,e,#,g,#,#,f,#,#,#};
int b={1,3,4,6,5,7,8,4,54};
铁汁们,你想要那个就用哪个!我用char好了,Int比较常见!
int main()
{
char a[100];
scanf("%s", a);
return 0;
}
ok,我们输入数据;char a={ a,b,c,#,#,d,e,#,g,#,#,f,#,#,#};
共有代码!
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
printf("%c ", root->_data);
BinaryTreePrevOrder(root->_left);
BinaryTreePrevOrder(root->_right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
BinaryTreeInOrder(root->_left);
printf("%c ", root->_data);//根的打印
BinaryTreeInOrder(root->_right);
}
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
BinaryTreePostOrder(root->_left);
BinaryTreePostOrder(root->_right);
printf("%c ", root->_data);
}
效果:
重点:层序遍历!
层序遍历是通过队列实现的!
首先,解释:
1进入队列,1出去时,带进2,3
2出去时带入4,5
3出去时带入6
4出去时带入7
5出去时带入8
void BinaryTreeLevelOrder(BTNode* root)
{
Queue qu;
BTNode* cur;
QueueInit(&qu);//初始化
QueuePush(&qu, root);//添加头结点
while (!QueueIsEmpty(&qu)) / /为空直接跳出循环
{
cur = QueueTop(&qu);
putchar(cur->_data);
if (cur->_left)//如果有左子树,push
{
QueuePush(&qu, cur->_left);
}
if (cur->_right)//如果有右子树,push
{
QueuePush(&qu, cur->_right);
}
QueuePop(&qu);//出掉头节点
}
QueueDestory(&qu);//进行销毁!
}
补充:
对于队列如下:注意应该把Int 变为 BTreeNode型
以下是queue的cpp文件!
// 初始化队列
void QueueInit(Queue* q)
{
assert(q);
q->_front = q->_rear = NULL;
q->size = 0;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{
assert(q);
//二种情况!
QNode* tmp = (QNode*)malloc(sizeof(QNode));
if (tmp == NULL)
{
perror("malloc fail!");
return;//或exit(1)
}
tmp->_data = data;
tmp->_next = NULL;
if (q->_rear)//此时不为空
{
q->_rear->_next = tmp;
q->_rear = q->_rear->_next;
}
else//此时为空
{
q->_front = q->_rear = tmp;
}
q->size++;
}
// 队头出队列
void QueuePop(Queue* q)
{
assert(q);
//也分二种情况
//此时也要判断一下盖队列是否为空
assert(q->_rear);//直接暴力解决!
if (q->_rear->_next == NULL)
{
q->_front = q->_rear = NULL;
}
else//此时不止一个数据!
{//常规思路
QNode* cur = q->_front->_next;
free(q->_front);
q->_front = cur;
}
q->size--;
}
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
assert(q->_rear);
return q->_front->_data;
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
assert(q);
assert(q->_rear);
return q->_rear->_data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
assert(q);
assert(q->_rear);
return q->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)//此处爷可以用bool型
{
assert(q);
assert(q->_rear);
return q->size;
}
// 销毁队列
void QueueDestroy(Queue* q)//要一个一个销毁!
{
assert(q);
assert(q->_rear);
QNode* cur = q->_front;
while (cur)
{
QNode* next = cur->_next;
free(cur);
cur = next;
}
q->_front = q->_rear = NULL;
q->size = 0;
}
就到这里啦!