当前所在位置:珠峰网资料 >> 计算机 >> 软件水平 >> 正文
2015年软件水平程序员考试复习笔试知识辅导(二)
发布时间:2012/6/14 11:28:29 来源:城市网学院 编辑:ziteng
  -
  二叉树三种遍历的非递归算法(背诵版)
  1.先序遍历非递归算法
  #define maxsize 100
  typedef struct
  {
  Bitree Elem[maxsize];
  int top;
  }SqStack;
  void PreOrderUnrec(Bitree t)
  {
  SqStack s;
  StackInit(s);
  p=t;
  while (p!=null || !StackEmpty(s))
  {
  while (p!=null) //遍历左子树
  {
  visite(p->data);
  push(s,p);
  p=p->lchild;
  }//endwhile
  if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历
  {
  p=pop(s);
  p=p->rchild;
  }//endif
  }//endwhile
  }//PreOrderUnrec
  2.中序遍历非递归算法
  #define maxsize 100
  typedef struct
  {
  Bitree Elem[maxsize];
  int top;
  }SqStack;
  void InOrderUnrec(Bitree t)
  {
  SqStack s;
  StackInit(s);
  p=t;
  while (p!=null || !StackEmpty(s))
  {
  while (p!=null) //遍历左子树
  {
  push(s,p);
  p=p->lchild;
  }//endwhile
  if (!StackEmpty(s))
  {
  p=pop(s);
  visite(p->data); //访问根结点
  p=p->rchild; //通过下一次循环实现右子树遍历
  }//endif
  }//endwhile
  }//InOrderUnrec [NextPage]   3.后序遍历非递归算法
  #define maxsize 100
  typedef enum{L,R} tagtype;
  typedef struct
  {
  Bitree ptr;
  tagtype tag;
  }stacknode;
  typedef struct
  {
  stacknode Elem[maxsize];
  int top;
  }SqStack;
  //后序遍历
  void PostOrderUnrec(Bitree t)
  {
  SqStack s;
  stacknode x;
  StackInit(s);
  p=t;
  do
  {
  while (p!=null) //遍历左子树
  {
  x.ptr = p;
  x.tag = L; //标记为左子树
  push(s,x);
  p=p->lchild;
  }
  while (!StackEmpty(s) &&s.Elem[s.top].tag==R)
  {
  x = pop(s);
  p = x.ptr;
  visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点
  }
  if (!StackEmpty(s))
  {
  s.Elem[s.top].tag =R; //遍历右子树
  p=s.Elem[s.top].ptr->rchild;
  }
  }while (!StackEmpty(s));
  }//PostOrderUnrec  4.层次遍历算法
  // 二叉树的数据结构
  structBinaryTree
  {
  int value; // 不写模板了,暂时用整形代替节点的数据类型
  BinaryTree *left;
  BinaryTree *right;
  };
  BinaryTree*root; // 已知二叉树的根节点
  //层次遍历
  voidLevel( const BinaryTree *root )
  {
  Queue *buf = new Queue(); // 定义一个空队列,假设此队列的节点数据类型也是整形的
  BinaryTree t; // 一个临时变量
  buf.push_back(root); //令根节点入队
  while( buf.empty == false ) // 当队列不为空
  {
  p = buf.front(); // 取出队列的第一个元素
  cout<value<<' ';
  if( p->left != NULL ) // 若左子树不空,则令其入队
  {
  q.push( p->left );
  }
  if( p->right != NULL ) // 若右子树不空,则令其入队
  {
  q.push( p->right );
  }
  buf.pop(); // 遍历过的节点出队
  }
  cout<}
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved