牛客网top101二叉树(前序遍历,中序遍历,后序遍历)

这篇博客介绍了二叉树的三种遍历方法:前序遍历(根左右)、中序遍历(左根右)和后序遍历(左右根)。每种遍历都通过递归实现,详细阐述了遍历的过程,并给出了Java代码实现。前序遍历从根节点开始,然后是左子树,最后是右子树;中序遍历先遍历左子树,再访问根节点,最后是右子树;后序遍历则是先遍历左右子树,最后访问根节点。
摘要由CSDN通过智能技术生成

前序遍历

在这里插入图片描述
什么是二叉树的前序遍历? 简单来说就是 “根左右”,展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的访问方式,直到到达叶子节点。
从上述前序遍历的解释中我们不难发现,它存在递归的子问题:每次访问一个节点之后,它的左子树是一个要前序遍历的子问题,它的右子树同样是一个要前序遍历的子问题。那我们可以用递归处理:

终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
**返回值:**每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
本级任务:每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。

因此处理的时候,过程就是:

step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
step 2:从根节点开始进入递归,遇到空节点就返回,否则将该节点值加入数组。
step 3:依次进入左右子树进行递归。

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] preorderTraversal (TreeNode root) {
        // write code here
        //用数组来记录遍历到地节点值
        List<Integer> list = new ArrayList<>();
        dfs(list,root);
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
    public void dfs(List<Integer> list,TreeNode root) {
        if(root != null) {
            list.add(root.val);
            dfs(list,root.left);
            dfs(list,root.right);
        }  
    }
}

中序遍历

在这里插入图片描述
解题思路:
什么是二叉树的中序遍历,简单来说就是“左根右”,展开来说就是对于一棵二叉树,我们优先访问它的左子树,等到左子树全部节点都访问完毕,再访问根节点,最后访问右子树。同时访问子树的时候,顺序也与访问整棵树相同。

从上述对于中序遍历的解释中,我们不难发现它存在递归的子问题,根节点的左右子树访问方式与原本的树相同,可以看成一颗树进行中序遍历,因此可以用递归处理:

终止条件:当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
返回值:每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
本级任务:每个子问题优先访问左子树的子问题,等到左子树的结果返回后,再访问自己的根节点,然后进入右子树。

因此处理的时候,过程就是:

step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
step 2:从根节点开始进入递归,遇到空节点就返回,否则优先进入左子树进行递归访问。
step 3:左子树访问完毕再回到根节点访问。
step 4:最后进入根节点的右子树进行递归。

代码:

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] inorderTraversal (TreeNode root) {
        // write code here
        //中序遍历,遵循 左--根--右
           //中序遍历  遵循左--->根--->右
    //创建一个集合来存储遍历的结点值
    List<Integer> list = new ArrayList<>();
    zx(list,root);

    int[] arr = new int[list.size()];
    
    
    for(int i = 0;i<arr.length;i++){
        //将集合中的元素转存到数组中                                                
        arr[i] = list.get(i);
    }
    return arr;
}
private void zx(List<Integer> list,TreeNode root){
    //递归到底情况
    if(root==null){
        return;
    }
   //遍历左树
    zx(list,root.left);
	//存入结点
    list.add(root.val);
	//遍历右树
    zx(list,root.right);
    }
}

后序遍历:
就是讲上面的代码中的改变一下顺序即可,就是所谓的“左右根”;
这个左右根就是说插入的顺序,代码应该是

	//遍历左树
    zx(list,root.left);
    //遍历右树
    zx(list,root.right);
	//存入结点
    list.add(root.val);
	

我这个代码只是简写了一下,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值