二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历

来源:互联网 发布:约会 知乎 编辑:程序博客网 时间:2024/05/17 22:35

二叉树的结点定义

typedef struct BiTNode {
 TElemType data;
 BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;

 

二叉树的创建:根据字符数组创建字母ABC等代表结点,#代表空子树

也是用递归实现

bool CreateBiTree(BiTree &T,char *s,int &pos)//创建二叉树,s为字符数组pos为数组下标,第一次调用pos==0
{
 if(*(s+pos)=='#')
 {
  T=NULL;
 }
 else if(*(s+pos)=='\0')
 {
  T=NULL;
  return true;
 }
 else
 {
  T=new BiTNode;
  if(T==NULL)
  {
   cout<<"error";
   return false;
  }
  
  T->data=*(s+pos);
  T->lchild=NULL;
  T->rchild=NULL;
  CreateBiTree(T->lchild,s,++pos);
  CreateBiTree(T->rchild,s,++pos);
 }
 return true;
}

 

//递归先序遍历二叉树

先序很简单,无非是访问根节点,递归访问左结点,递归访问右结点
void PreOrderTraverse(BiTree T)

{
 if(T!=NULL)
 {
  cout<<T->data;//cout打印出来就算是访问了,当然你可以写个访问函数
  PreOrderTraverse(T->lchild);
  PreOrderTraverse(T->rchild);
 }
 else return;
}

 

//递归中序遍历二叉树

中序的算法为:递归访问左子树-->访问根结点,-->递归访问右子树

void InOrderTraverse(BiTree T)
{
 if(T!=NULL)
 {
  InOrderTraverse(T->lchild);
  cout<<T->data;
  InOrderTraverse(T->rchild);
 }
 else return;
}

 

//递归后序遍历二叉树

递归访问左子树-->递归访问右子树-->访问根结点
void PostOrderTraverse(BiTree T)//递归后序遍历二叉树
{
 if(T!=NULL)
 {
  PostOrderTraverse(T->lchild);
  PostOrderTraverse(T->rchild);
  cout<<T->data;
 }
 else return;
}

从上面可以看出先序,中序,后序递归遍历二叉树,无非是访问根结点的顺序不同

   //。。。访问根结点在前就是先序。。。

递归访问左子树

   //。。。访问根结点在中间就是中序遍历。。。

递归访问右子树

  //。。。访问根结点在最后就是后序遍历。。。


 

层序遍历二叉树

void LeverOrderTraverse(BiTree T)
{
 if(T==NULL)return;
 
 Queue q;  //利用队列的先进先出特点,根结点先进,所以根结点先被访问,再进做孩子,有孩子
 q.push(T);//压入根结点
 
 BiTree p;//用一个对列保存结点
 
 while (!q.IsEmpty()) {
  q.pop(p);
  cout<<p->data;      //访问根节点
  if (p->lchild!=NULL)
  {
   q.push(p->lchild);//做孩子入列
  }
  if (p->rchild!=NULL)
  {
   q.push(p->rchild);//右孩子入列
  }
 }
}