ツリーの前順序、中順序、後続、階層遍歴統一アルゴリズム
public class TreeNode { //
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
一:前段遍歴
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
class Solution {
class ColorNode {
TreeNode node;
char color;
public ColorNode(TreeNode node,char color){
this.node = node;
this.color = color;
}
}
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList();
if(root == null) return ans;
Deque<ColorNode> stack = new ArrayDeque();
stack.addLast(new ColorNode(root, '0'));
while(!stack.isEmpty()) {
ColorNode cur = stack.pollLast();
if(cur.color == '0') {
if(cur.node.right != null) {
stack.addLast(new ColorNode(cur.node.right, '0'));
}
if(cur.node.left != null) {
stack.addLast(new ColorNode(cur.node.left, '0'));
}
stack.addLast(new ColorNode(cur.node, '1'));
}else {
ans.add(cur.node.val);
}
}
return ans;
}
}
二:中序遍歴
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
class Solution {
class ColorNode {
TreeNode node;
char color;
public ColorNode(TreeNode node,char color){
this.node = node;
this.color = color;
}
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList();
if(root == null) return ans;
Deque<ColorNode> stack = new ArrayDeque();
stack.addLast(new ColorNode(root, '0'));
while(!stack.isEmpty()) {
ColorNode cur = stack.pollLast();
if(cur.color == '0') {
if(cur.node.right != null) {
stack.addLast(new ColorNode(cur.node.right, '0'));
}
stack.addLast(new ColorNode(cur.node, '1'));
if(cur.node.left != null) {
stack.addLast(new ColorNode(cur.node.left, '0'));
}
}else {
ans.add(cur.node.val);
}
}
return ans;
}
}
三:後順遍歴
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
class Solution {
class ColorNode {
TreeNode node;
char color;
public ColorNode(TreeNode node,char color){
this.node = node;
this.color = color;
}
}
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList();
if(root == null) return ans;
Deque<ColorNode> stack = new ArrayDeque();
stack.addLast(new ColorNode(root, '0'));
while(!stack.isEmpty()) {
ColorNode cur = stack.pollLast();
if(cur.color == '0') {
stack.addLast(new ColorNode(cur.node, '1'));
if(cur.node.right != null) {
stack.addLast(new ColorNode(cur.node.right, '0'));
}
if(cur.node.left != null) {
stack.addLast(new ColorNode(cur.node.left, '0'));
}
}else {
ans.add(cur.node.val);
}
}
return ans;
}
}
四:階層遍歴
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
class Solution {
class ColorNode {
TreeNode node;
char color;
int lev;
public ColorNode(TreeNode node,char color,int lev){
this.node = node;
this.color = color;
this.lev = lev;
}
}
public List<List<Integer>> levelderTraversal(TreeNode root) {
List<List<Integer>> ans = new ArrayList();
if(root == null) return ans;
Deque<ColorNode> stack = new ArrayDeque();
stack.addLast(new ColorNode(root, '0', 0));
while(!stack.isEmpty()) {
ColorNode cur = stack.pollLast();
int lev = cur.lev;
if(cur.color == '0') {
if(cur.node.right != null) {
stack.addLast(new ColorNode(cur.node.right, '0', lev+1));
}
if(cur.node.left != null) {
stack.addLast(new ColorNode(cur.node.left, '0', lev+1));
}
stack.addLast(new ColorNode(cur.node, '1', lev));
}else {
if(lev == ans.size()) ans.add(new ArrayList());
ans.get(lev).add(cur.node.val);
}
}
return ans;
}
}
参照:カラータグ法-一般的で簡明なツリー遍歴方法