NC45 实现二叉树先序、中序和后序遍历
NC45 实现二叉树先序、中序和后序遍历
题目
描述
给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。
数据范围:0 ≤ n ≤1000,树上每个节点的val值满足 0≤val≤100
要求:空间复杂度 O(n),时间复杂度 O(n)
样例解释:
如图二叉树结构
示例1
输入:
{1,2,3}
返回值:
[[1,2,3],[2,1,3],[2,3,1]]
说明:
如题面图
示例2
输入:
{}
返回值:
[[],[],[]]
备注:
n≤10^6
题解
先序遍历:中左右
中序遍历: 左中右
后序遍历: 右左中
//前序遍历
preOrder(TreeNode root){
if(root == null)return null;
System.out.println(root.val);//前序先打印
preOrder(root.left);//遍历左子树
preOrder(root.right);//遍历右子树
}
//中序遍历
meOrder(TreeNode root){
if(root == null)return null;
preorder(root.left)//遍历左子树
System.out.println(root.val);
preorder(root.left)//遍历右子树
}
//后序遍历
postOrder(TreeNode root){
if(root == null)return null;
preorder(root.left)//遍历左子树
preorder(root.left)//遍历右子树
System.out.println(root.val);
}
这道题的要求是打印在一个二维数组里。
public class Solution {
public int[][] threeOrders (TreeNode root) {
ArrayList<Integer>arr1=new ArrayList<>();
ArrayList<Integer>arr2=new ArrayList<>();
ArrayList<Integer>arr3=new ArrayList<>();
traversal(root,arr1,arr2,arr3);
int [][] res = new int [3][arr1.sieze()];
for(int i = 0; i < arr1.size(); i++){
res[0][i] = arr1.get(i);
res[1][i] = arr2.get(i);
res[2][i] = arr3.get(i);
}
return res;
}
//传地址,直接修改
public void traversal(TreeNode root,ArrayList<Integer> arr1,ArrayList<Integer> arr2,ArrayList<Integer> arr3){
if(root == null)return;
arr1.add(root.val);
traversal(root.left,arr1,arr2,arr3);//遍历左子树
arr2.add(root.val);
traversal(root.right,arr1,arr2,arr3);//遍历右子树
arr3.add(root.val);
}
}