遍历二叉树

这篇博客介绍了二叉树的三种遍历方法:先序遍历(DLR)、中序遍历(LDR)和后序遍历(LRD)。分别讲解了递归和非递归的实现算法,帮助读者理解如何遍历每个节点一次且仅一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遍历二叉树: 指按某条搜索路径巡防树中每个结点,使得每个结点都被访问一次且仅为一次;

三种遍历情况:

  • 先序遍历二叉树:DLR(先访问根结点,然后访问左子树,最后访问右子树);

递归算法

void inordertraverse(BiTree T)
{      //先序遍历二叉树T的递归算法
if(T)    //若二叉树非空
{
cout<<T->data;    //先访问根节点
inordertraverse(T->lchild);   //在访问左子树
inordertraverse(T->rchild);
}
}

非递归算法

  • 初始化一个空栈S,指针p指向根结点

  • 申请一个结点空间q,用来存放栈顶弹出的元素;

  • 当p非空或者栈S非空时,循环执行以下操作:

  • [? ] 如果p非空,则将p进栈,p指向该节点的根节点

  • [?] 如果p为空,则弹出栈顶元素并访问,将p指向该结点的右孩子;

void inordertraverse(BiTree T)
{
initstack(s);   p=T;
q= new BiTNoede;
while(p||!StackEmpty(S))
  {
    if(p)     //p非空
   {
     Push(S,p);    //根指针进栈
     cout<<p->data;//根指针进栈,访问根结点;
    }
else          //p为空
    {
      Pop(S,q);  //退栈
      p=q->lchild;  //遍历左子树
      p=q->rchild; //遍历右子树
       }
    }
}
  1. 中序遍历二叉树:LDR(先访问左子树,在访问根结点,最后访问右子树);

递归算法:

void inordertraverse(BITree T)
{   //中序遍历二叉树T 的递归算法
      if(T)    //判断是否为空
  {
    inordertraverse(T->lchild);
     cout<<T->data;
     inoredertraverse(T->rchild);
    }
}

非递归算法:

void inordertraverse(BiTree T)
{    //中序遍历二叉树T的非递归算法
     initStack(S);  p=T;
      q=new BiTNode;
      while (p|| !StackEmpty(S))
      {
         if(p) 
         {
         Push(S,p);         //根指针进栈
         p=p->lchild;   //根指针进栈,遍历左子树
         }
         else 
         {
               Pop(S,q);  //退栈
               cout<<q->data;     //访问根结点
               p=q->rchild;           //遍历右子树
            }
          }
  }
  1. 后序遍历二叉树:LRD(先访问左子树,在访问右子树,最后访问根节点)
void inordertraverse(BiTree T)
{ //后序遍历二叉树
      if(T)    
       {
            inordertraverse(T->lchild);
            inordertraverse(T-.rchild);
            cout<<T->data;
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值