目录
一、该题基础信息列表
- 题目难易分类【easy】【middle】【hard】
- 题目频率(牛客有考察次数)【高频】(10<=考察次数) 【中频】(2 <=考察次数 < 10) 【普通】
先/中/后 序 遍历 | LeetCode | 牛客【题库--算法篇--面试高频榜单】 |
题序号 | NC45 实现二叉树先序,中序和后序遍历 | |
难度 & 频次 | 【easy】 | 【middle】【高频】 |
二、【实现二叉树的先序,中序和后序遍历】编程练习目标
本题考点:【树】【哈希】【栈】
本题是所有二叉树的基础核心,是树类相关题型进行扩展的前提。
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
二叉树的遍历主要有三种,括号内为其特点:
(1)先(根)序遍历(根左右)
(2)中(根)序遍历(左根右)
(3)后(根)序遍历(左右根)
练习目标:
1、对三种遍历模式熟练掌握,是二叉树最基本的基础核心
2、可尝试使用两种方法解决(本题以递归模式解法),方法一:递归 方法二:非递归+栈
三、解题步骤
3-1、题目
3-2、解题步骤和代码实现
树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
树的遍历仍然根本是树,基础是树的结构体:
//二叉树的结构体
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
this.left = null;
this.right = null;
}
}
3-2-1、前序遍历实现
//前序遍历 【根,左,右】
void preOrder(TreeNode root, List<Integer> list){
if(root == null)
return;
list.add(root.val);
preOrder(root.left);
preOrder(root.right);
}
3-2-2、中序遍历实现
//中序遍历【左、根、右】
void middleOrder(TreeNode root, List<Integer> list){
if(root == null)
return;
middleOrder(root.left);
list.add(root.val);
middleOrder(root.right);
}
3-2-3、后序遍历实现
//后续遍历 【左,右,根】
void postOrder(TreeNode root, List<Integer> list){
if(root == null)
return;
postOrder(root.left, list);
postOrder(root.right,list);
list.add(root.val);
}
四、完整代码实现
import java.util.*;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
this.left = null;
this.right = null;
}
}
public class Solution {
/**
* @param root TreeNode类 the root of binary tree
* @return int整型二维数组
*/
public int[][] threeOrders (TreeNode root) {
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
List<Integer> c = new ArrayList<Integer>();
//进行 前,中,后遍历
preOrder(root,a);
middleOrder(root,b);
postOrder(root,c);
int[][] res = new int[3][a.size()];
for(int i =0; i < a.size(); i++){
res[0][i] = a.get(i);
res[1][i] = b.get(i);
res[2][i] = c.get(i);
}
return res;
}
//前序【根,左,右】
private void preOrder(TreeNode root, List<Integer> list){
if(root == null){
return;
}
list.add(root.val);
preOrder(root.left, list);
preOrder(root.right, list);
}
//中序【左,根,右】
private void middleOrder(TreeNode root, List<Integer> list){
if(root == null){
return;
}
middleOrder(root.left, list);
list.add(root.val);
middleOrder(root.right, list);
}
//后序【左,右,根】
private void postOrder(TreeNode root, List<Integer> list){
if(root == null){
return;
}
postOrder(root.left, list);
postOrder(root.right,list);
list.add(root.val);
}
}