数据结构(暑假篇7.23)

二叉树的四种遍历

void InorderTraversal(BinTree BT)
{//中序遍历 
  if(BT)
  { 
 InorderTraversal(BT->left);
 printf("%d",BT->Data);
 InorderTraversal(BT->right);
  }  
}

void PreorderTraversal(BinTree BT)
{//前序遍历 
   if(BT)
   {
 printf("%d",BT->Data);
 PreorderTraversal(BT->left);
 PreorderTraversal(BT->right);
   }
}

void PostorderTraversal(BinTree BT)
{//后序遍历 
  if(BT)
  {
 PostorderTraversal(BT->left);
 PostorderTraversal(BT->right);
 printf("%d",BT->Data);
  }
}

void LevelorderTraversal(BinTree BT)
{//层序遍历 
 Queue Q;
 BinTree T;
 if(!BT)return;//若是空树直接返回 
 Q=CreateQueue();//创建空队列Q 
 AddQ(Q,BT);
 while(!IsEmpty(Q))
 {
  T=DeleteQ(Q);
  printf("%d",T->Data);//访问取出队列的结点 
  if(T->left)AddQ(Q,T->left);
  if(T->right)AddQ(Q,T->right);
 }
}

前中后三种遍历的区别在于printf()函数的位置,也即对应了访问到第几次会输出此结点。
层序遍历则是弹出根节点,依次将它的左右子结点加入队列,并依此循环,直到队列为空。

中序前序遍历非递归遍历算法

void InorderTraversal(BinTree BT)
{//中序遍历非递归遍历算法 
 Stack S=CreateStack(MAXSIZE);
 BinTree T=BT;
 while(T||!IsEmpty(S))
 {
  while(T)
  {
   Push(S,T);
   T=T->left;
  }
  if
    (!IsEmpty(S))
  {
   T=Pop(S);
   printf("%d",T->Data);
   T=T->right;
  }
 }
}

void PreorderTraversal (BinTree BT)
{//前序遍历非递归算法 
 Stack S=CreateStack(MAXSIZE);
 BinTree T=BT;
 while(T||!IsEmpty(S))
 {
  while(T)
  {
   Push(S,T);
   printf("%d",T->Data);
   T=T->left;
  }
    if(!IsEmpty(S))
  {
   T=Pop(S);
   T=T->right;
  }
 }
 } 
 

两种非递归遍历算法循环的条件都相同,当T不为空或栈非空时继续循环,区别只在于printf()的位置不同,前序是在Push()后即输出,而中序则是在Pop(S)后输出,分别对应着第一次,第二次遍历此节点。

输出二叉树中的叶子结点

void  PreOrderPrintLeaves(BinTree BT)
{
 if(BT)
 {
  if(!BT->left&&!BT->right)
  printf("%d",BT->Data);
  PreOrderPrintLeaves(BT->left);
  PreOrderPrintLeaves(BT->right);
 }
}

整体就是前序遍历,区别只是在于判断结点是否有左右子结点,若没有即输出此结点,否则向下遍历。

求二叉树的高度

void PreOrderPrintLeaves(BinTree BT)
{
 int ML,MR,MAXH;
 if(BT)
 {
  ML=PreOrderPrintLeaves(BT->left);
  MR=PreOrderPrintLeaves(BT->right);
  MAXH=(ML>MR)?ML:MR;
  return (MAXH+1);
 }
 else return 0;
}

将树从根节点分为两部分,分别计算左子树和右子树的高度,取其中的最大值,加1(根结点)即得到二叉树的高度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值