时间:2026-01-06 09:00
人气:
作者:admin
请实现⼀个函数按照之字形打印⼆叉树,即第⼀⾏按照从左到右的顺序打印,第⼆层按照从右⾄左的顺序打印,第三⾏按照从左到右的顺序打印,其他⾏以此类推。
示例1
输⼊:{8,6,10,5,7,9,11}
返回值:[[8],[10,6],[5,7,9,11]]
public class Solution {
public ArrayList < ArrayList < Integer >> Print(TreeNode pRoot) {
LinkedList < TreeNode > nodes = new LinkedList < > ();
ArrayList < ArrayList < Integer >> results = new ArrayList();
boolean reverse = true;
if (pRoot != null) {
nodes.add(pRoot);
while (!nodes.isEmpty()) {
ArrayList < Integer > integers = new ArrayList();
int size = nodes.size();
for (int i = 0; i < size; i++) {
TreeNode node = nodes.poll();
if (reverse) {
integers.add(node.val);
} else {
integers.add(0, node.val);
}
if (node.left != null) {
nodes.offer(node.left);
}
if (node.right != null) {
nodes.offer(node.right);
}
}
if (integers.size() != 0) {
results.add(integers);
}
reverse = !reverse;
}
}
return results;
}
}
这是最直接的方法。我们进行标准的层序遍历,但用一个标志位记录当前层是奇数层还是偶数层。对于偶数层,我们在将该层的节点值列表加入最终结果前,先进行反转
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
boolean leftToRight = true; // 方向标志,true表示从左到右
while (!queue.isEmpty()) {
int levelSize = queue.size(); // 当前层的节点数
ArrayList<Integer> levelList = new ArrayList<>();
// 遍历当前层的所有节点
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
levelList.add(node.val); // 将节点值加入当前层列表
// 将下一层的节点按标准顺序(先左后右)加入队列
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
// 如果是偶数层(从第0层开始算则为奇数索引),反转当前层列表
if (!leftToRight) {
Collections.reverse(levelList);
}
result.add(levelList);
leftToRight = !leftToRight; // 切换方向
}
return result;
}
}
Collections.reverse的时间复杂度为 O(当前层节点数),所有层的节点数相加为 n,因此总时间复杂度为 O(n)。利用栈后进先出(LIFO)的特性来自然地实现顺序的反转。我们使用两个栈,一个用于处理当前层,另一个用于存储下一层的节点
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null) return result;
Stack<TreeNode> stack1 = new Stack<>(); // 处理奇数层(从左到右)
Stack<TreeNode> stack2 = new Stack<>(); // 处理偶数层(从右到左)
stack1.push(pRoot);
// 当两个栈都为空时,遍历结束
while (!stack1.isEmpty() || !stack2.isEmpty()) {
ArrayList<Integer> levelList = new ArrayList<>();
if (!stack1.isEmpty()) {
// 处理stack1(奇数层),其子节点将以“从右到左”的顺序压入stack2
while (!stack1.isEmpty()) {
TreeNode node = stack1.pop();
levelList.add(node.val);
// 关键:先左子节点后右子节点入栈,出栈顺序则为先右后左
if (node.left != null) stack2.push(node.left);
if (node.right != null) stack2.push(node.right);
}
} else {
// 处理stack2(偶数层),其子节点将以“从左到右”的顺序压入stack1
while (!stack2.isEmpty()) {
TreeNode node = stack2.pop();
levelList.add(node.val);
// 关键:先右子节点后左子节点入栈,出栈顺序则为先左后右
if (node.right != null) stack1.push(node.right);
if (node.left != null) stack1.push(node.left);
}
}
result.add(levelList);
}
return result;
}
}
本文来自在线网站:seven的菜鸟成长之路,作者:seven,转载请注明原文链接:www.seven97.top