算法系列--二叉树的三种遍历的六种实现

本文详细介绍了二叉树的前序、中序和后序遍历方法,包括递归和非递归两种实现方式,并提供了具体的代码示例。

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

0.

二叉树是常见的数据结构,二叉树常见的遍历方式有前序遍历,中序遍历和后序遍历。前序遍历就是中-左-右节点的顺序,中序遍历就是左-中-右节点的顺序,后序遍历就是左-右-中节点的顺序。这三种遍历最常见的实践方式就是利用递归了,但是大家都明白,递归其实是可以用循环来代替的,所以除了递归的方式,还要循环的方法,同时递归还可以理解为栈的入栈和出栈的过程,配合循环,就可以实现相应的非递归遍历。

1.

由于实在太过简单,不说了,直接上代码:

//前序递归遍历
  private void perorder(TreeNode treeNode)
  {
    if(treeNode!=null)
    {
        System.out.println("node is "+treeNode.val);
        perorder(treeNode.left);
        perorder(treeNode.right);
    }
  }

  //前序非递归遍历
  private void perorder(Stack<TreeNode> stack, TreeNode treeNode)
  {
     if(treeNode==null)
     {
      return;
     }
     TreeNode temp=treeNode;
     while(temp!=null)
     {
        System.out.println("node is "+temp.val);
        if(temp.right!=null)
        {
          stack.push(temp.right);
        }
        if(temp.left!=null)
        {
         stack.push(temp.left);
       }
        if(stack.empty())
        {
          break;
        }
        temp=stack.peek();
        stack.pop();
     }
 
  }

   //中序递归遍历
  private void midorder(TreeNode treeNode)
  {
    if(treeNode!=null)
    {
       midorder(treeNode.left);
       System.out.println("node is "+treeNode.val);
       midorder(treeNode.right); 
    }
  }

  //中序非递归遍历
  private void midorder(Stack<TreeNode> stack,TreeNode treeNode)
  {
      if(treeNode==null)
      {
        return;
      }
      TreeNode temp=treeNode;
      while(!stack.empty() || temp!=null)
      {
        if(temp!=null)
        {
          stack.push(temp);
          temp=temp.left;
        }
        else
        {
          temp=stack.pop();
          System.out.println("node is "+temp.val);
          temp=temp.right;
        }
      }

  }


  //后序递归遍历
  private void endorder(TreeNode treeNode)
  {
     if(treeNode!=null)
     {
        endorder(treeNode.left);
        endorder(treeNode.right);
        System.out.println("node is "+treeNode.val);
     }

  }
  
  //后序非递归遍历
  private void endorder(Stack<TreeNode> stack,TreeNode treeNode)
  {
      if(treeNode==null)
      {
        return;
      }
      TreeNode temp=treeNode;
      stack.push(treeNode);
      while(!stack.empty())
      {
         TreeNode cur=stack.peek();
         if(cur.left!=null && temp!=cur.left && temp!=cur.right)
         {
            stack.push(cur.left);
         }
         else if(cur.right!=null && temp!=cur.right)
         {
           stack.push(cur.right);
         }
         else
         {
           System.out.println("node is "+cur.val);
           stack.pop();
           temp=cur;
         }

      }
  }


 public static class TreeNode
 {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val)
    {
       this.val=val;
    }
 }
复制代码

关注我的公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值