• 数据结构— — 二叉树的遍历


      🎃Hello,大家好,今天我们要做的是 二叉树的遍历。


    🎯目的:

    1、掌握二叉树的特点及其存储方式。

    2、掌握二叉树的创建

    3、掌握二叉树前序、中序、后序遍历的基本方法及应用。


    🎯内容:

    1、用前序方法建立一棵二叉树。

    2、编写前序遍历二叉树的程序。

    3、编写中序遍历二叉树的程序。

    4、编写后序遍历二叉树的程序。

    5、编写程序实现二叉树中的一些基本操作。


    🎯环境:

    TC或VC++。


    🎯步骤:

    1、二叉树的二叉链表存储类型定义:

    1. typedef struct BiTNode
    2. {
    3. datatype  data;
    4. struct BiTNode *lchild ,*rchild ;
    5. } BiTNode,*BiTree;

    2、使用先序遍历建立下图所示的二叉树:      

    3、编程实现以上二叉树的前序、中序和后序遍历操作,并输出遍历序列:

    (1)先序遍历二叉树并输出遍历序列(ABCDEGF);

    (2)中序遍历二叉树并输出遍历序列(CBEGDFA);

    (3)后序遍历二叉树并输出遍历序列(CGEFDBA)。

    4、计算二叉树的深度:

    算法基本思想:

    递归计算左子树的深度记为m;递归计算右子树的深度记为n;如果m大于n,二叉树的深度为m+1,否则为n+1。

    5、统计二叉树中结点的总数:

    算法基本思想:

    如果是空树,则结点个数为0;结点个数为左子树的结点个数+右子树的结点个数再+1。

    6、统计二叉树中叶子结点的个数:

    算法基本思想:

    先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点” 的操作改为:若是叶子,则计数器增1。

    7、在主函数中实现相关函数的调用。

    1. #include
    2. using namespace std;
    3. typedef struct BiTNode{//定义二叉树
    4.        char data;
    5.        struct BiTNode *lchild,*rchild;
    6. }BiTNode,*BiTree;
    7. void CreateBiTree(BiTree &T){//先序遍历二叉树
    8.        char ch;
    9.        cin>>ch;
    10.        if(ch=='#')
    11.               T=NULL;//结束,空树;
    12.        else{
    13.               T=new BiTNode;
    14.               T->data=ch;
    15.               CreateBiTree(T->lchild);
    16.               CreateBiTree(T->rchild);
    17.        }
    18. }
    19. void PreOrderTraverse(BiTree T){//先序遍历输出
    20.        if(T){
    21.               cout<data;
    22.               PreOrderTraverse(T->lchild);
    23.               PreOrderTraverse(T->rchild);
    24.        }
    25. }
    26. void InOrderTraverse(BiTree T){//中序遍历输出
    27.        if(T){
    28.               InOrderTraverse(T->lchild);
    29.               cout<data;
    30.               InOrderTraverse(T->rchild);
    31.        }
    32. }
    33. void PostOrderTraverse(BiTree T){//后序遍历输出
    34.        if(T){
    35.               PostOrderTraverse(T->lchild);
    36.               PostOrderTraverse(T->rchild);
    37.               cout<data;
    38.        }
    39. }
    40. int Depth(BiTree T){//计算深度
    41.        int m,n;
    42.        if(T==NULL)
    43.               return 0;//空树,深度为0
    44.        else
    45.        {
    46.               m=Depth(T->lchild);
    47.               n=Depth(T->rchild);
    48.               if(m>n)
    49.                      return m+1;
    50.               else{
    51.                      return n+1;
    52.               }
    53.        }
    54. }
    55. int NodeCount(BiTree T){//总结点
    56.        if(T==NULL){
    57.               return 0;
    58.        }
    59.        else
    60.               return  NodeCount(T->lchild)+ NodeCount(T->rchild)+1;
    61.              
    62. }
    63. int LeafCount(BiTree T){//叶子节点
    64.        if(T==NULL)
    65.               return 0;
    66.        if(T->rchild==NULL&&T->lchild==NULL){
    67.               return 1;
    68.        }
    69.        else{
    70.               return LeafCount(T->lchild)+LeafCount(T->rchild);
    71.        }
    72. }
    73. int main(){
    74.        BiTree t;
    75.        cout<<"请输入所要建立的二叉树的序列:"<
    76.        cout<<"提示:先序为:(ABC##DE#G##F###)"<
    77.        CreateBiTree(t);
    78.        cout<
    79.        cout<<"先序遍历输出为:"<
    80.        PreOrderTraverse(t);
    81.        cout<
    82.        cout<<"中序遍历输出为:"<
    83.        InOrderTraverse(t);
    84.        cout<
    85.        cout<<"后序遍历输出为:"<
    86.        PostOrderTraverse(t);
    87.        cout<
    88.        cout<<"二叉树的深度为:"<
    89.        cout<<Depth(t)<
    90.        cout<<"二叉树的总结点为:"<
    91.        cout<<NodeCount(t)<
    92.        cout<<"二叉树的叶子节点为:"<
    93.        cout<<LeafCount(t)<
    94.        return 0;
    95. }

    [附加题]

    哈夫曼树的构造:

    根据给定的N个权值{7,6,3,5}建立哈夫曼树,并输出终态表查看构造结果。

    终态表:

    序号

    权值

    parent

    lchild

    rchild

    1

    7

    6

    0

    0

    2

    6

    6

    0

    0

    3

    3

    5

    0

    0

    4

    5

    5

    0

    0

    5

    8

    7

    3

    4

    6

    13

    7

    2

    1

    7

    21

    0

    5

    6

    🎯 结果:

    1. #include
    2. using namespace std;
    3. typedef struct{
    4. int weight;
    5. int parent,lchild,rchild;
    6. }HTNode,*HuffmanTree;
    7. void Select(HuffmanTree HT,int x,int &s1,int &s2);
    8. void CreateHuffmanTree(HuffmanTree &HT,int n){
    9. if(n<=1)
    10. return;
    11. int m=2*n-1;
    12. HT=new HTNode[m+1];//0号不用
    13. for(int i=1;i<=m;i++){//初始化
    14. HT[i].parent=0;
    15. HT[i].lchild=0;
    16. HT[i].rchild=0;
    17. }
    18. cout<<"输入哈夫曼树的权值(用空格隔开):"<
    19. for(int i=1;i<=n;i++){//输入叶子结点的权值
    20. cin>>HT[i].weight;
    21. }
    22. int s1,s2,i;
    23. for(i=n+1;i<=m;i++){
    24. Select(HT,i-1,s1,s2);
    25. HT[s1].parent=i;
    26. HT[s2].parent=i;
    27. HT[i].lchild=s1;
    28. HT[i].rchild=s2;
    29. HT[i].weight=HT[s1].weight+HT[s2].weight;
    30. }
    31. }
    32. void Select(HuffmanTree HT,int x,int &s1,int &s2){
    33. int min1=100000;
    34. for(int k=1;k<=x;k++){
    35. if(HT[k].parent==0&&HT[k].weight
    36. min1=HT[k].weight;
    37. s1=k;
    38. }
    39. }
    40. // HT[s1].weight=100000000;
    41. HT[s1].parent=1;
    42. int min2=1000000;
    43. for(int k=1;k<=x;k++){
    44. if(HT[k].parent==0&&HT[k].weight
    45. min2=HT[k].weight;
    46. s2=k;
    47. }
    48. }
    49. // HT[s1].weight=min1;
    50. HT[s1].parent=0;
    51. }
    52. int main(){
    53. HuffmanTree ht;
    54. int n=4;
    55. CreateHuffmanTree(ht,n);
    56. printf("终态表如下:\n序号 权值 parent lchild rchild \n");
    57. for(int i=1;i<=2*n-1;i++){
    58. printf(" %2d %2d %2d %2d %2d \n",i,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
    59. }
    60. }

     🎃以上是本期的所有内容了,请大佬多多在评论区指正!

     🌞我是IT闫,期待你的关注!!!❤️

  • 相关阅读:
    并发编程:使用Scala Future和Akka实现并发处理
    低代码开发技术选型
    小心XSS攻击......
    Mysql表的约束
    ECCV 2022|文本图像分析领域再起波澜,波士顿大学联合MIT和谷歌提出全新多模态新闻数据集NewsStories
    C#开发——基础语法
    Pr:更改文本和形状的外观
    Web前端大作业——基于HTML+CSS+JavaScript仿英雄联盟LOL游戏网站
    JShaman JavaScript混淆加密工具,中英版本区别
    数据结构笔记——树和图(王道408)(持续更新)
  • 原文地址:https://blog.csdn.net/shsjssnn/article/details/133435576