案例数据
3
/ \
9 20
/ \
15 7
实现
package com.gallant.test;
import java.util.ArrayList;
import java.util.List;
/**
* @author : 会灰翔的灰机
* @date : 2021/4/30
*/
public class ZigzagLevelOrder {
/**
* @param root :
* @return :
*/
public static List<List<TreeNode>> zigzagLevelOrder(TreeNode root) {
List<List<TreeNode>> result = new ArrayList<>();
List<TreeNode> levelData = new ArrayList<>();
levelData.add(root);
int level = 1;
while (levelData.size() > 0) {
level++;
List<TreeNode> newLevelData = new ArrayList<>();
// 奇数层:左-》右
if (level % 2 != 0) {
for (int i = 0; i < levelData.size(); i++) {
TreeNode node = levelData.get(i);
if (node.left != null) {
newLevelData.add(node.left);
}
if (node.right != null) {
newLevelData.add(node.right);
}
}
} else {
// 偶数层: 右-》左
for (int i = levelData.size() - 1; i >= 0; i--) {
TreeNode node = levelData.get(i);
if (node.right != null) {
newLevelData.add(node.right);
}
if (node.left != null) {
newLevelData.add(node.left);
}
}
}
result.add(levelData);
levelData = newLevelData;
}
return result;
}
public static void main(String[] args) {
System.out.println(zigzagLevelOrder(init()));
}
/**
* 3
* / \
* 9 20
* / \
* 15 7
*/
private static TreeNode init() {
TreeNode three = TreeNode.builder().val(3).build();
TreeNode nine = TreeNode.builder().val(9).build();
TreeNode twenty = TreeNode.builder().val(20).build();
TreeNode fifteen = TreeNode.builder().val(15).build();
TreeNode seven = TreeNode.builder().val(7).build();
three.left = nine;
three.right = twenty;
nine.left=fifteen;
nine.right=seven;
return three;
}
}
@Data
@Builder
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
@Override
public String toString() {
return "" + val;
}
}
结果
[[3], [20, 9], [15, 7]]
总结
- 采用指针方式决定同层级正逆向遍历
- 结合栈结构进行同层级反向的遍历