• 10 二叉树-链式存储-递归遍历


    终于进入非线性数据结构的第一站了!

    先从简单的开始回忆起来吧!


    1、二叉树的链式存储

    用一个链表来存储一颗二叉树,每一个结点用链表的一个链结点来存储。

    通常地,一个二叉链表至少包含3个域:数据域data、左指针域lchild、右指针域rchild。

    现实应用的过程中,可以按照自己的需求添加其他指针域。

    1 typedef struct BitNode{
    2 int data;
    3 struct BitNode *lchild,*rchild;
    4 }BitNode,*BiTree;

    2、遍历

    二叉树的遍历的定义:

    按某个搜索路径访问树中的每个结点,使得每个结点均被访问一次且仅被访问一次。

    递归式访问二叉树:

    (1)、基本的三种:先序(中左右)、中序(左中右)、后序(左右中)。

    (2)、三种遍历算法的递归遍历左子树、右子树的顺序都是固定的。只是访问根节点的顺序不同。

    (3)、递归遍历中递归工作栈恰好为树的深度,在最坏的情况下,二叉树是有n个结点而且深度为n的单支树,此时遍历算法的空间复杂度为O(n)。

    【注】这三种遍历方式的算法描述简单易懂,应能作为模板记忆。

    3、具体代码实现

     1 #include<iostream>
     2 #include<stdlib.h>
     3 #include<cstdio>
     4 using namespace std;
     5 #define TRUE 1
     6 #define FALSE 0
     7 #define OK 1
     8 #define ERROR 0
     9 #define OVERFLOW -2
    10 typedef int Status;
    11 typedef int ElemType;
    12 
    13 /*存储结构描述*/
    14 typedef struct BitNode{
    15 int data;
    16 struct BitNode *lchild,*rchild;
    17 }BitNode,*BiTree;
    18 /*建立树*/
    19 void initTree(BiTree &T)
    20 {
    21     int x;
    22     cin>>x;
    23     if(x==0)
    24     {
    25         T=NULL;
    26     }
    27     else {//按照先序遍历建树
    28         T=(BitNode*)malloc(sizeof(BitNode));
    29         T->data=x;
    30         initTree(T->lchild);
    31         initTree(T->rchild);
    32     }
    33 }
    34 
    35 void visit(BiTree T)
    36 {
    37     cout<<T->data<<' ';
    38 }
    39 /*递归方式访问树*/
    40 /*先序遍历*/
    41 void preOrder(BiTree T)
    42 {
    43     if(T!=NULL){
    44         visit(T);
    45         preOrder(T->lchild);
    46         preOrder(T->rchild);
    47     }
    48 }
    49 void inOrder(BiTree T)
    50 {
    51     if(T!=NULL)
    52     {
    53         inOrder(T->lchild);
    54         visit(T);
    55         inOrder(T->rchild);
    56     }
    57 }
    58 void postOrder(BiTree T)
    59 {
    60     if(T!=NULL)
    61     {
    62         postOrder(T->lchild);
    63         postOrder(T->rchild);
    64         visit(T);
    65     }
    66 }
    67 int main()
    68 {
    69     BiTree tree;
    70     cout<<"Create tree in preOrder.:"<<endl;
    71     initTree(tree);
    72     cout<<"--- show the preorder sequence: ---"<<endl;
    73     preOrder(tree);
    74     cout<<endl;
    75     cout<<"--- show the inorder sequence: ---"<<endl;
    76     inOrder(tree);
    77     cout<<endl;
    78     cout<<"--- show the postorder sequence: ---"<<endl;
    79     postOrder(tree);
    80     return 0;
    81 }

    4、实现截图

  • 相关阅读:
    shell 学习笔记 LinuxShell脚本攻略(第2版)
    [六省联考2017]分手是祝愿
    [SDOI2010]粟粟的书架
    [CQOI2018]解锁屏幕
    [SCOI2007]最大土地面积
    CF369E Valera and Queries
    CF817F MEX Queries
    [HEOI2016/TJOI2016]求和
    [CQOI2018]九连环
    [HNOI2015]亚瑟王
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/7499288.html
Copyright © 2020-2023  润新知