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


    先建树

    1 typedef struct BiTNode//二叉树的二叉链表存储
    2 {
    3     int data;
    4     struct BiTNode *lchild,*rchild;/* 左右孩子指针 */
    5 }BiTNode,*BiTree;
    6 //将BiTree定义为指向二叉链表节点结构的指针类型

    递归写法简单又清晰:

    先序遍历(DLR)的递归过程为:若二叉树为空,遍历结束。否则:

    1. 访问根结点
    2. 先序遍历根结点的左子树
    3. 先序遍历根结点的右子树

    遍历过程如图

    先序遍历

      

    1 /* 先序遍历 */
    2 void PreOrder(BiTree bt)
    3 {
    4     if(bt==NULL) return;/* 递归调用的结束条件 */
    5     Visit(bt->data); /* 访问结点的数据域 */
    6     PreOrder(bt->lchild);/* 先序递归遍历bt的左子树 */
    7     PreOrder(bt->rchild);/* 先序递归遍历bt的右子树 */
    8 }
    中序遍历(LDR)的递归过程:
    若二叉树非空,则依次执行如下操作:
    ⑴遍历左子树;
    ⑵访问根结点;
    ⑶遍历右子树。

    遍历过程如图:

    代码如下:

    1 /* 中序遍历 */
    2 void InOrder(BiTree bt)
    3 {
    4     if(bt==NULL) return;/* 递归调用的结束条件 */
    5     InOrder(bt->lchild);;/* 中序递归遍历bt的左子树 */
    6     Visit(bt->data);/* 访问结点的数据域 */
    7     InOrder(bt->rchild);/* 中序递归遍历bt的右子树 */
    8 }
    后序遍历(LRD)的递归过程为:
    若二叉树为空则结束返回,否则:
    (1)后序遍历左子树
    (2)后序遍历右子树
    (3)访问根结点
    遍历过程如图:
    代码如下:
    1 /* 后序遍历 */
    2 void PostOrder(BiTree bt)
    3 {
    4     if(bt==NULL) return;/* 递归调用的结束条件 */
    5     PreOrder(bt->lchild);;/* 后序递归遍历bt的左子树 */
    6     PreOrder(bt->rchild);/* 后序递归遍历bt的右子树 */
    7     Visit(bt->data);/* 访问结点的数据域 */
    8 }

     差点忘了放层次遍历(就是忘了

    这是我的队列写法(有错的话请一定要指出啊....:

     1 /* 层次遍历 */
     2 void LevelOrder(BiTree bt)
     3 {
     4     queue<BiTree> que;
     5     if(bt==NULL) return;
     6     que.push(bt);//根结点入队
     7     while(!que.empty())
     8     {
     9         BiTree front=que.front();
    10         que.pop();
    11         Visit(front->data);
    12         if(front->lchild!=NULL)//将队首结点的左孩子结点入队
    13             que.push(front->lchild);
    14         if(front->rchild!=NULL)//将队首结点的右孩子结点入队
    15             que.push(front->rchild);
    16     }
    17 }

     二叉树的元素查找算法:

     1 /* 二叉树的元素查找算法 */
     2 BiTree Search(BiTree bt,int x)/* 假装要找的是int */
     3 {
     4     BiTree p;
     5     p=bt;
     6     if(p->data==x) return p; //查找成功返回
     7     if(p->lchild!=NULL) return (Search(p->lchild,x));//继续查找
     8     if(p->rchild!=NULL) return (Search(p->rchild,x));//继续查找
     9     return NULL;//查找失败了::>_<::
    10 }

     求二叉树的深度:

     1 /* 二叉树的深度运算  */
     2 int treehigh(BiTree bt)
     3 {
     4     int lh,rh,h;
     5     if(bt==NULL) h=0;
     6     else
     7     {
     8         lh=treehigh(bt->lchild);
     9         rh=treehigh(bt->rchild);
    10         h=(lh>rh?lh:rh)+1;
    11     }
    12     return h;
    13 }
  • 相关阅读:
    Oracle 不走索引
    Oracle不等值链接
    查看统计信息是否过期
    JavaScript利用append添加元素报错
    Subversion Native Library Not Available & Incompatible JavaHL library loaded
    Oracle并行查询出错
    Oracle连接出错(一)
    Linux下Subclipse的JavaHL
    Java生成文件夹
    Java生成文件
  • 原文地址:https://www.cnblogs.com/graytido/p/10403321.html
Copyright © 2020-2023  润新知