北京交通大学计算机专业考研辅导班笔记(数据结构)(4)

北京交通大学 /2009-04-04


  { if (pin[i]= =ch) b=true;
    else  i++;
  }
if (b= =true)  return i;
}
          Void Creat(Bitree &T, int pp, int pi, int n)
          //pre[]为二叉树的先序序列,pp为子树在先序序列中的起始下标,ino[]为二叉树的中序序列,pi为子树在中序中的起始下标,n为树中结点数;
            { if (n<=0)  T=Null;
             else
               { T=(BiTNode*)malloc(sizeof(BiTNode));
                 T->data=pre[pp];  m=pos(pre[pp],ino,pi);
                 Llen=m-pi;  Rlen=n-Llen-1;  //求T的左右子树在中序中的长度
                 Create(T->lch,pp+1,pi,Llen);  //建立左子树
                 Create(T->rch,pp+Llen+1,m+1,Rlen); //建立右子树
               }
             }
11. 由二叉树的中序和后序序列建立二叉树
能手工作出,相关程序参阅(04年程序阅读第一题)老师没有写出程序。
12. 按给定的表达式建立相应二叉链表
(1) 由先缀表达式建树(与普通二叉树的区别是:无度为1的结点,只有度为0或2的结点,因为操作数有2个),可唯一确定二叉树
(2) 有原表达式建树,要先将其转化为对应的先缀形式
13.线索二叉树的定义
14.先序遍历二叉数(考填空或选择,书上没有,记住)
(1) 采用二叉链表
无论是否是叶子结点,找结点P的先序前驱都不容易,得从根结点开始;
若P非叶子,找P的先序后继,容易(有左孩子的就是其左孩子,无左孩子则是右孩子),不用从根结点开始;若P是叶子结点,找先序后继也不容易
(2) 采用线索二叉链表,找P的先序前驱
(a) P是根,前驱为空;
(b) P是其双亲的左孩子,前驱为双亲
(c) P是其双亲的右孩子,且无左兄,则前驱是其双亲
(d) P是其双亲的右孩子,且有左兄,则前驱是其左兄最右下的叶子
即使是线索二叉链表,找P的先序前驱均不容易
          (3)采用线索二叉链表,找P的先序后继
(a) P有右孩子
P有左孩子,则后继为其左孩子;
P无左孩子,则后继为其右孩子;
(b) P无右孩子, 则后继为其rch;
BinNode  *findson(BinNode *p)
   { if (p->ltag= =0)  return  p->lch; //p有左孩子,后继为左孩
else return  p->rch;   //p无左孩,后继为其右指针 
}
15. 中序遍历二叉树
    (1). 采用二叉链表
        若左右子树非空,找p的中序前驱和中序后继容易,不用从根开始
        若左右子树为空,找p的中序后继和前驱,不容易,得从根开始
16. 后序遍历二叉树
    (1). 采用二叉链表
        若P非叶子,则找P的后序前驱,容易,不用从根开始;若P是叶子,找后序前驱不容易;
        找P的后序后继,无论是否是叶子,都不容易,得从根开始
(2)采用线索二叉树,找P的后序前驱
(a). P有左孩子
     P有右孩子,则前驱为其右孩
     P无右孩子,则其前驱为其左孩
(b).P无左孩子, 前驱为其lch
BinNode  *findpre(BiNode  *p)
  { if (p->rtag= =0) return  p->rch;  //P有右,前驱为右孩子
   else  return p->lch;  //p无右孩,前驱为其左指针。
          (3). 采用线索二叉树,找P的后序后继
(a). P是根, 后继为空
(b). P是双亲结点的右孩子,后继为双亲
(c). P 是双亲的左孩子,且无右兄,后继为双亲
(d).P是双亲结点的左孩子,有右兄,后继为右兄最左下的叶子。
后序线索二叉链表中,找后继不容易
17. 树的存储结构
    树的二叉链表(孩子-兄弟)存储表示法(必须掌握)
18. 森林转换成二叉树:将各科树分别转换成二叉树,将根结点用线相连,以第一棵树根结点作为树的根,把线顺时针转45度
19. 二叉树转化成森林:
  一抹线: 将二叉树中的根与其右孩子的连线,及右分支搜索到的所有右孩子的连线全部抹掉,使之变成孤立的二叉树。
  一还原: 将孤立的二叉树还原成树
20. 树的遍历 (先根,后根)
21. 森林的遍历
(1) 先序遍历:即依次从左至右对森林中的每一棵树进行先根遍历
(2) 中序遍历:即依次从左至右对森林中的每棵树进行后跟遍历
22. 树,二叉树,森林遍历的对应关系
树            森林                二叉树
           先根           先序                先序
           后根           中序                中序
23.求树的深度的算法
     递归公式如下:
    depth(t)=0               若t=Null
    depth(t)=max{depth(t->firstchilid)+1, depth(t->nextsibling)}
  int TreeDepth(CsTree T)
    { if (!T)  return();
     else {  h1=TreeDepth(T->firstchild);
           h2=TreeDepth(T->nextsibling);
           return(max((h1+1),h2));  //填程序时不能直接写Max,要写成可执行语句(用if  else )
         }
      return ((h1+1)>h2 ? (h1+1): h2);
     }
24.归求树中叶子结点的个数 (04年真题)
树中的叶子结点是二叉树中firstchild 为空的结点
解1:   int  Countleaf(CsNode *T)
   {int leaf; CsNode *T1;
if (!T)   return 0;
else {if (!T->fch) return 1;
    else  { leaf=0; T1=T->fch;
           while (T1)
             {leaf=leaf+Countleaf(T1);
              T1=T1->nsib;
             }
           return leaf;
          }
    }
        }
解2:  int Countleaf(CsNode *T)
         {  int leaf; CsNode *T1;
            if (!T)  return 0;
            else {  if (!T->fch)
                    { leaf=1+Countleaf(T->nsb);  return(leaf);}
                  else 
                    { leaf=Countleaf(T->fch)+Countleaf(T->nsb);  return(leaf)}

相关话题/

  • 领限时大额优惠券,享本站正版考研考试资料!
    大额优惠券
    优惠券领取后72小时内有效,10万种最新考研考试考证类电子打印资料任你选。涵盖全国500余所院校考研专业课、200多种职业资格考试、1100多种经典教材,产品类型包含电子书、题库、全套资料以及视频,无论您是考研复习、考证刷题,还是考前冲刺等,不同类型的产品可满足您学习上的不同需求。 ...
    本站小编 Free壹佰分学习网 2022-09-19