数据结构第三周笔记(5)——树(上)(慕课浙大版本--XiaoYu)

89 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

二叉树的遍历

3.3.1 先序中序后序遍历

二叉树的遍历

(1)先序遍历
遍历过程为:
1.访问根节点
2.先序遍历其左子树
3.先序遍历其右子树 
​
对应的递归程序:
void PreOrderTraversal(BinTree BT)//BT是树
{
    if( BT ){//看树是不是空的,空的就退出去,不空就访问根节点
        printf("d",BT->Data);
        PreOrderTraversal(BT->Left);//指向左子树的那个根节点的地址进行递归
        PreOrderTraversal(BT->Right);//指向右子树的那个根节点的地址进行递归
    }
}

image-20220701101511679

先是从根开始  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);//指向右子树的那个根节点的地址进行递归
    }
}

image-20220701102142532

中序遍历 => 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的左边

image-20220701103417703

(3)后序遍历
遍历过程为:
1.后序遍历其左子树
2.中序遍历其右子树 
3.访问根结点
对应的递归程序:
void PreOrderTraversal(BinTree BT)//BT是树
{
    if( BT ){//看树是不是空的,空的就退出去,不空就访问根节点
        PreOrderTraversal(BT->Left);//指向左子树的那个根节点的地址进行递归
        PreOrderTraversal(BT->Right);//指向右子树的那个根节点的地址进行递归
        printf("d",BT->Data);
    }
}

image-20220701103619016

注意点:后序遍历,那当然得从下面开始咯,所以会发现B跟E是E优先。H跟C比是H优先
 (D E F B)(H G I C) A
 后序遍历 => D E F B H G I C A
总结
先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同
图中先从入口到出口的曲线上用三种符号分别标记除先序,中序和后序的访问各结点时刻

image-20220701112206952