zoukankan      html  css  js  c++  java
  • 层序遍历、遍历二叉树的应用

    二叉树遍历的本质是怎么样把一个二维结构变成一个一维的线性序列的过程
    核心问题:二维结构的线性化
    从结点访问其左右儿子结点
    访问左儿子后,右儿子结点怎么办?
    需要一个寻出结构保存咱叔不访问的结点
    存储结构:堆栈、队列
    队列实现:遍历从根节点开始,首先将根节点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队

     1 void LevelOrderTraversal (BinTree BT)
     2 {
     3     Queue Q; BinTree T;
     4     if(!BT)return ;        //若是空树则直接返回
     5     Q = CreateQueue(MaxSize);    //创建并初始化队列
     6     AddQ(Q, BT);
     7     while(!IsEmptyQ(Q)
     8     {
     9         T = Delete(Q);
    10         printf("%d", T->data);    //访问取出的 结点
    11         if(T->Left)  AddQ(Q, T->Left);
    12         if(T->Right) AddQ(Q, T->Right);
    13     }
    14 }

    遍历二叉树的应用:输出二叉树的叶子节点

     1 void PreOrderPrintLeaves(BinTree BT)
     2 {
     3     if(BT)
     4     {
     5         if(!BT->Left && !BT->right)
     6             printf(“%d", BT->data);
     7         PreOrderPrintLeaves(BT->Left);
     8         PreOrderPrintLeaves(BT->Right);
     9     }
    10 }

    2.求二叉树的高度

     1 int PostOrderGetHight(BinTree BT)
     2 {
     3     int HL, HR, MaxH;
     4     if(BT)
     5     {
     6         HL = PostOrderGetHight(BT->Left);    //求左子树的高度
     7         HR = PostOrderGetHight(BT->Right);    //求右子树的高度
     8         MaxH = (HL > HR) ? HL : HR;    //取左右字树的较大高度
     9         return (MaxH + 1);            //返回树的高度
    10     }
    11     else
    12         return 0;        //空树的高度为0
    13 }

    3.二元运算表达式树及其遍历
    前缀表达式和后缀表达式都是正确的,中缀表达式会受运算符优先级的影响
    但是可以用加括号的方式来消除这种影响

    4.先序和中序序列来确定一棵二叉树
    根据先序遍历序列第一个结点确定根节点
    再根据根节点在中序遍历序列中分割出左右两个子序列
    最后对左子树和右子树分别递归使用相同的方法继续分解
    5.类似的,后序和中序遍历序列也可以确定一棵二叉树

  • 相关阅读:
    PHP 速度测试函数
    ajax的简单应用之快速入门
    PHP漏洞详解
    jQuery Ajax 实例 全解析
    2007年最后的一天
    近来心情格外的郁闷
    使用 Ajax 实现 lightbox
    GridView删除,编辑应用
    完美的wsus客户端注册表文件
    VISTA桌面显示Internet Explorer
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9528019.html
Copyright © 2011-2022 走看看