二叉树遍历

二叉树遍历可以使用深度优先遍历广度优先遍历,深度优先又可以分为前序、中序、后序三种方式遍历,每种方式都可以通过递归和非递归方法实现。

一、深度优先递归遍历:

前序遍历算法:

  • 先遍历根结点
  • 再递归遍历左子树
  • 最后递归遍历右子树
    在这里插入图片描述
  • 首先访问根结点A;
  • 遍历A结点的左子树,B结点。
  • B结点有子结点,再按照前序遍历方式遍历,先访问根结点,即B;
  • 遍历B结点左子树,D结点;
  • D结点没有子结点,遍历B结点的右子树,E结点;到此,B结点的根结点、左子树、右子树、已经遍历完成;
  • 遍历A结点的右子树,C结点;
  • C结点有子结点,再按照前序遍历方式遍历,先访问根结点,即C;
  • 遍历C结点左子树,F结点;
  • F结点没有子结点,遍历C结点的右子树,G结点;到此,C结点的根结点、左子树、右子树、已经遍历完成;

最终的访问顺序为:A->B->D->E->C->F->G

代码实现:
结点类:

//结点
public class TreeNode{
    private String data;
    private TreeNode left;
    private TreeNode right;
  
  public TreeNode(String data,TreeNode left,TreeNode right){
      this.data = data;
      this.left = left;
      this.right = right;
  }
}

递归实现前序遍历二叉树:

private List<String> list = new ArrayList<String>();
    //前序遍历
    public List<String> preTreeNode(TreeNode node){
      list.add(node.data);
      if(node.left  != null)
         preTreeNode(node.left);
      if(node.right != null)
         preTreeNode(node.right);
      return list;
  	}

中序遍历算法:

  • 先递归遍历的左子树
  • 再遍历根节点
  • 最后递归遍历右子树
    在这里插入图片描述
  • 首先访问根结点A的左子树B;
  • B结点有子结点,访问B结点的左子树,D;
  • D没有子结点,遍历D结点;
  • 返回遍历B结点;
  • 遍历E结点;
  • 至此,以B为根节点的部分遍历完成,返回遍历A结点部分;
  • 遍历A结点;
  • 访问C结点,C结点有子结点,访问C结点的左子树,F;
  • F没有子结点,遍历F结点;
  • 返回遍历C结点;
  • 遍历C结点的右子树,G结点;
    最终遍历顺序:D->B->E->A->F->C->G

代码实现:
结点类:

//结点
public class TreeNode{
    private String data;
    private TreeNode left;
    private TreeNode right;
  
  public TreeNode(String data,TreeNode left,TreeNode right){
      this.data = data;
      this.left = left;
      this.right = right;
  }
}

递归实现中序遍历二叉树:

    //中序遍历
    public List<String> inTreeNode(TreeNode node){
      if(node.left  != null){
         preTreeNode(node.left);
      }
     list.add(node.data);
      if(node.right != null){
         preTreeNode(node.right);
      }
      return list;
    }

后序递归遍历算法:

  • 先递归遍历的左子树
  • 再递归遍历右子树
  • 最后遍历根节点
    在这里插入图片描述
  • 首先访问根结点A的左子树B;
  • B结点有子结点,访问B结点的左子树,D;
  • D没有子结点,遍历D结点;
  • 遍历E结点;
  • 遍历B结点;
  • 至此,以B为根节点的部分遍历完成,返回遍历A结点部分;
  • 访问C结点,C结点有子结点,访问C结点的左子树,F;
  • F没有子结点,遍历F结点;
  • 遍历G结点;
  • 遍历C结点;
  • 至此,以C为根节点的部分遍历完成,返回遍历A结点部分;
  • 遍历A结点;
    最终遍历顺序:D->E->B->F->G->C->A
    代码实现:
    结点类:
//结点
public class TreeNode{
    private String data;
    private TreeNode left;
    private TreeNode right;
  
  public TreeNode(String data,TreeNode left,TreeNode right){
      this.data = data;
      this.left = left;
      this.right = right;
  }
}

递归实现后序遍历二叉树:

    //后序遍历
    public List<String> inTreeNode(TreeNode node){
      if(node.left  != null){
         preTreeNode(node.left);
      }
      if(node.right != null){
         preTreeNode(node.right);
      }
      list.add(node.data);
      return list;
    }

待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值