开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
3.3.1 先序中序后序遍历
二叉树的遍历
(1)先序遍历
遍历过程为:
1.访问根节点
2.先序遍历其左子树
3.先序遍历其右子树
对应的递归程序:
void PreOrderTraversal(BinTree BT)//BT是树
{
if( BT ){//看树是不是空的,空的就退出去,不空就访问根节点
printf("d",BT->Data);
PreOrderTraversal(BT->Left);//指向左子树的那个根节点的地址进行递归
PreOrderTraversal(BT->Right);//指向右子树的那个根节点的地址进行递归
}
}
先是从根开始 A(B D F E)(C G H I)
先序遍历=>A B D F E C G H I
(2)中序遍历
遍历过程为:
1.中序遍历其左子树
2.访问根结点;
3.中序遍历其右子树
对应的递归程序:
void PreOrderTraversal(BinTree BT)//BT是树
{
if( BT ){//看树是不是空的,空的就退出去,不空就访问根节点
PreOrderTraversal(BT->Left);//指向左子树的那个根节点的地址进行递归
printf("d",BT->Data);
PreOrderTraversal(BT->Right);//指向右子树的那个根节点的地址进行递归
}
}
中序遍历 => D B E F A G H C I
(D B E F) A ( G H C I)
先是左边再右边,这里我原本的疑问是为什么是先E在F而不是先F再E
原因是E-F是一个树,然后因为这个是左子树,所以从左边开始,E在F的左边
(3)后序遍历
遍历过程为:
1.后序遍历其左子树
2.中序遍历其右子树
3.访问根结点
对应的递归程序:
void PreOrderTraversal(BinTree BT)//BT是树
{
if( BT ){//看树是不是空的,空的就退出去,不空就访问根节点
PreOrderTraversal(BT->Left);//指向左子树的那个根节点的地址进行递归
PreOrderTraversal(BT->Right);//指向右子树的那个根节点的地址进行递归
printf("d",BT->Data);
}
}
注意点:后序遍历,那当然得从下面开始咯,所以会发现B跟E是E优先。H跟C比是H优先
(D E F B)(H G I C) A
后序遍历 => D E F B H G I C A
总结
先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同
图中先从入口到出口的曲线上用三种符号分别标记除先序,中序和后序的访问各结点时刻