【二叉树】BM24 二叉树的中序遍历

一、题目

牛客题目链接二叉树的中序遍历_牛客题霸_牛客网

题目描述:

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

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

示例1:

输入:{1,2,#,#,3}

返回值:[2,3,1]

说明:

示例2:

输入:{}

返回值:[]

示例3:

输入:{1,2}

返回值:[2,1]

说明:

示例4:

输入:{1,#,2}

返回值:[1,2]

说明:

备注:

树中节点数目在范围 [0, 100] 内

树中的节点的值在[-100,100]以内

二、解题思路&代码实现

方案一:递归遍历

解题思路:

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

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为二叉树的节点数,遍历二叉树所有节点
  • 空间复杂度:O(n)O(n),最坏情况下二叉树化为链表,递归栈深度为nn

代码实现:

go:

package main
// import "fmt"
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型一维数组
*/
func inorderTraversal( root *TreeNode ) []int {
    // write code here
    res := make([]int, 0)
    if root == nil {
        return res
    }
    res = append(res, inorderTraversal(root.Left)...)
    res = append(res, root.Val)
    res = append(res, inorderTraversal(root.Right)...)
    return res
}

java:

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 {
    public void inorder(List<Integer> list, TreeNode root){
        //遇到空节点则返回
        if(root == null) 
            return;
        //先去左子树
        inorder(list, root.left); 
        //再访问根节点
        list.add(root.val); 
        //最后去右子树
        inorder(list, root.right); 
    }
    
    public int[] inorderTraversal (TreeNode root) {
        //添加遍历结果的数组
        List<Integer> list = new ArrayList(); 
        //递归中序遍历
        inorder(list, root); 
        //返回的结果
        int[] res = new int[list.size()]; 
        for(int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值