一、题目
牛客题目链接:二叉树的中序遍历_牛客题霸_牛客网
题目描述:
给定一个二叉树的根节点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;
}
}