【编程题 递归+非递归】BM24 二叉树的中序遍历(详细注释 易懂)

题目描述

题目链接二叉树的中序遍历_牛客题霸_牛客网 (nowcoder.com)

给定一个二叉树的根节点root,返回它的中序遍历结果。

数据范围:树上节点数满足 0 \le n \le 10000≤n≤1000,树上每个节点的值满足 0 \le val \le 10000≤val≤1000
进阶:空间复杂度  O(n),时间复杂度O(n)

示例1

输入:

{1,2,#,#,3}

返回值:

[2,3,1]

说明:

示例2

输入:

{}

返回值:

[]

示例3

输入:

{1,2}

返回值:

[2,1]

示例4

输入:

{1,#,2}

返回值:

[1,2]

题目解读:

      说到二叉树的中序遍历,很多人应该闭着眼睛也能做出来,确实,递归形式的二叉树遍历太简单了。但是如果面试官让你写非递归的呢,如果没有准备过,突然写,还是挺难的,那就来学习一下吧。

解题思想:

         中序遍历就是 左 根 右 ,依次遍历嘛,那就按这个思想做。递归版本的,我就不说了,主要说非递归版本的,一开始就是 从根节点一直进行左子树遍历,把遍历结果放到栈里面,遍历完成后,开始从栈里面弹出一个节点,这个节点当然就是 左子树里最下面的那个节点,弹出它以后(它是左子树最下面的子树,所以它肯定就没有左子树了),直接访问它里面的值,因为后序遍历是 左 根 右 ,访问完之后, 要确认它有没有右子树,如果它没有右子树,那就继续弹出。如果它有右子树,那就让root去遍历它的右子树。就结束了。比起后序遍历,难度简单了很多。

代码注释(递归):

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
        ArrayList<Integer> list = new ArrayList<>();
        inorder(list,root);
        int[] arr =new int[list.size()];
        for(int i=0;i< arr.length;i++){
            arr[i] = list.get(i);
        }
        return arr;
    }
    public void inorder(ArrayList<Integer> list,TreeNode root){
        if(root == null)
            return;
        inorder(list,root.left);
        list.add(root.val);
        inorder(list,root.right);
    }
}

代码注释(非递归):

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
          ArrayList<Integer>list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        while(!stack.isEmpty() || root!= null){
            while(root != null){
               stack.push(root);
                root = root.left;
                
            }
            TreeNode node =stack.pop();
            list.add(node.val);
       // 访问当前节点后,要判断它的右子树是否为空,不为空就访问
           if(node.right != null)
               root = node.right;
            
        }
        int[] arr = new int[list.size()];
        for(int i=0;i< list.size();i++){
            arr[i] = list.get(i);
        }
        return arr;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值