文章目录
LeetCode 94.二叉树的中序遍历题目描述方法一 递归方法二 基于栈的遍历
LeetCode 144.二叉树的前序遍历题目描述方法一 递归方法二 基于栈的遍历
模板化非递归的前中后序遍历(推荐)前序遍历中序遍历后序遍历
LeetCode 589.N叉树的前序遍历题目描述方法一 递归方法二 基于栈的遍历
LeetCode 590.N叉树的后序遍历题目描述方法一 递归方法二 基于栈的遍历
LeetCode 429.N叉树的层序遍历题目描述广度优先搜索(BFS)
LeetCode 94.二叉树的中序遍历
题目描述
题目链接 给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
方法一 递归
class Solution {
public List
<Integer> inorderTraversal(TreeNode root
) {
List
<Integer> list
= new ArrayList<>();
helper(root
, list
);
return list
;
}
private void helper(TreeNode root
, List
<Integer> list
){
if(root
!= null
){
if(root
.left
!= null
)
helper(root
.left
, list
);
list
.add(root
.val
);
if(root
.right
!= null
)
helper(root
.right
, list
);
}
}
}
方法二 基于栈的遍历
class Solution {
public List
<Integer> inorderTraversal(TreeNode root
) {
List
< Integer
> list
= new ArrayList < > ();
Stack
< TreeNode
> stack
= new Stack < > ();
TreeNode curr
= root
;
while (curr
!= null
|| !stack
.isEmpty()) {
while (curr
!= null
) {
stack
.push(curr
);
curr
= curr
.left
;
}
curr
= stack
.pop();
list
.add(curr
.val
);
curr
= curr
.right
;
}
return list
;
}
}
LeetCode 144.二叉树的前序遍历
题目描述
题目链接 给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
方法一 递归
class Solution {
public List
<Integer> preorderTraversal(TreeNode root
) {
List
<Integer> list
= new ArrayList<>();
helper(root
, list
);
return list
;
}
private void helper(TreeNode root
, List
<Integer> list
){
if(root
!= null
){
list
.add(root
.val
);
if(root
.left
!= null
)
helper(root
.left
, list
);
if(root
.right
!= null
)
helper(root
.right
, list
);
}
}
}
方法二 基于栈的遍历
class Solution {
public List
<Integer> preorderTraversal(TreeNode root
) {
List
<Integer> list
= new ArrayList<>();
Stack
<TreeNode> stack
= new Stack<>();
TreeNode curr
= root
;
while(curr
!= null
|| !stack
.isEmpty()){
while(curr
!= null
){
stack
.push(curr
);
list
.add(curr
.val
);
curr
= curr
.left
;
}
curr
= stack
.pop();
curr
= curr
.right
;
}
return list
;
}
}
模板化非递归的前中后序遍历(推荐)
这里的方法参考于LeetCode上PualKing的题解
前序遍历
class Solution {
public List
<Integer> preorderTraversal(TreeNode root
) {
List
<Integer> list
= new ArrayList<>();
Stack
<TreeNode> stack
= new Stack<>();
if(root
!= null
)
stack
.push(root
);
while(!stack
.isEmpty()){
TreeNode curr
= stack
.pop();
if(curr
!= null
){
if(curr
.right
!= null
)
stack
.push(curr
.right
);
if(curr
.left
!= null
)
stack
.push(curr
.left
);
stack
.push(curr
);
stack
.push(null
);
}else{
list
.add(stack
.pop().val
);
}
}
return list
;
}
}
中序遍历
class Solution {
public List
<Integer> inorderTraversal(TreeNode root
) {
List
< Integer
> list
= new ArrayList < > ();
Stack
< TreeNode
> stack
= new Stack < > ();
if(root
!= null
)
stack
.push(root
);
while (!stack
.isEmpty()) {
TreeNode curr
= stack
.pop();
if(curr
!= null
){
if(curr
.right
!= null
)
stack
.push(curr
.right
);
stack
.push(curr
);
stack
.push(null
);
if(curr
.left
!= null
)
stack
.push(curr
.left
);
}else{
list
.add(stack
.pop().val
);
}
}
return list
;
}
}
后序遍历
题目链接
class Solution {
public List
<Integer> postorderTraversal(TreeNode root
) {
List
<Integer> list
= new ArrayList<>();
Stack
<TreeNode> stack
= new Stack<>();
if(root
!= null
)
stack
.push(root
);
while(!stack
.isEmpty()){
TreeNode curr
= stack
.pop();
if(curr
!= null
){
stack
.push(curr
);
stack
.push(null
);
if(curr
.right
!= null
)
stack
.push(curr
.right
);
if(curr
.left
!= null
)
stack
.push(curr
.left
);
}else{
list
.add(stack
.pop().val
);
}
}
return list
;
}
}
LeetCode 589.N叉树的前序遍历
题目描述
题目链接 给定一个 N 叉树,返回其节点值的前序遍历。
例如,给定一个 3叉树 :
返回其前序遍历: [1,3,5,6,2,4]。
方法一 递归
class Solution {
public List
<Integer> preorder(Node root
) {
List
<Integer> list
= new ArrayList<>();
helper(root
, list
);
return list
;
}
private void helper(Node root
, List
<Integer> list
){
if(root
== null
)
return;
list
.add(root
.val
);
for(Node child
: root
.children
)
helper(child
, list
);
}
}
方法二 基于栈的遍历
class Solution {
public List
<Integer> preorder(Node root
) {
List
<Integer> list
= new ArrayList<>();
Deque
<Node> deque
= new ArrayDeque<>();
if(root
== null
)
return list
;
deque
.addLast(root
);
while(!deque
.isEmpty()){
Node cur
= deque
.pollLast();
list
.add(cur
.val
);
Collections
.reverse(cur
.children
);
for(Node child
: cur
.children
){
deque
.addLast(child
);
}
}
return list
;
}
}
LeetCode 590.N叉树的后序遍历
题目描述
题目链接 给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树 : 返回其后序遍历: [5,6,3,2,4,1].
方法一 递归
class Solution {
public List
<Integer> postorder(Node root
) {
List
<Integer> list
= new ArrayList<>();
helper(root
, list
);
return list
;
}
private void helper(Node root
, List
<Integer> list
){
if(root
== null
)
return;
for(Node child
: root
.children
){
helper(child
, list
);
}
list
.add(root
.val
);
}
}
方法二 基于栈的遍历
class Solution {
public List
<Integer> postorder(Node root
) {
LinkedList
<Integer> list
= new LinkedList<>();
Deque
<Node> deque
= new ArrayDeque<>();
if(root
== null
)
return list
;
deque
.addLast(root
);
while(!deque
.isEmpty()){
Node cur
= deque
.pollLast();
list
.offerFirst(cur
.val
);
for(Node child
: cur
.children
)
deque
.addLast(child
);
}
return list
;
}
}
LeetCode 429.N叉树的层序遍历
题目描述
题目链接 给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树 : 返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]
说明:
树的深度不会超过 1000。 树的节点总数不会超过 5000。
广度优先搜索(BFS)
class Solution {
public List
<List
<Integer>> levelOrder(Node root
) {
List
<List
<Integer>> list
= new ArrayList<>();
if(root
== null
)
return list
;
Queue
<Node> queue
= new LinkedList<>();
queue
.offer(root
);
while(!queue
.isEmpty()){
List
<Integer> curLevel
= new ArrayList<>();
int len
= queue
.size();
for(int i
= 0; i
< len
; i
++){
Node curr
= queue
.poll();
curLevel
.add(curr
.val
);
for(Node child
: curr
.children
)
queue
.offer(child
);
}
list
.add(curLevel
);
}
return list
;
}
}