/**
* 满二叉树的生成、添加单个元素、添加多个元素、前序遍历、中序遍历、后续遍历
*/
public class TreeUtils {
public static void main(String[] args) {
List<TreeNode> nodes = new ArrayList<TreeNode>();
// 测试addAll方法
String[] elements = new String[] { "A", "B", "C", "D", "E", "F", "G" };
List<String> list = new ArrayList<String>();
Collections.addAll(list, elements);
addAll(nodes, list);
middleOrder(nodes.get(0));
// 测试add方法
// add(nodes, "A");
// add(nodes, "B");
// add(nodes, "C");
// add(nodes, "D");
// add(nodes, "E");
// add(nodes, "F");
// add(nodes, "G");
// preOrder(nodes.get(0));
// System.out.println();
// System.out.println(JSONUtil.toJsonPrettyStr(nodes));
}
/**
* 添加元素
*
* @param parents 上层元素集合
* @param data 节点数据
*/
public static void add(List<TreeNode> parents, String data) {
if (parents == null || parents.size() == 0) {
TreeNode root = TreeNode.builder().data(data).index(0).build();
parents.add(root);
return;
}
List<TreeNode> nodes = new ArrayList<TreeNode>();
// 查找要插入节点的位置:遍历每一层
for (TreeNode parent : parents) {
TreeNode left = parent.getLeft();
if (left == null) {
left = TreeNode.builder().data(data).index(2 * parent.getIndex() + 1).build();
parent.setLeft(left);
return;
}
nodes.add(left);
TreeNode right = parent.getRight();
if (right == null) {
right = TreeNode.builder().data(data).index(2 * parent.getIndex() + 1).build();
parent.setRight(right);
return;
}
nodes.add(right);
}
add(nodes, data);
}
/**
* 添加多个元素
*
* @param parents 上层元素集合
* @param list 节点数据集合
*/
public static void addAll(List<TreeNode> parents, List<String> list) {
if (list.size() == 0) {
return;
}
List<TreeNode> nodes = new ArrayList<TreeNode>();
if (parents == null || parents.size() == 0) {
TreeNode root = TreeNode.builder().data(list.get(0)).index(0).build();
parents.add(root);
nodes.add(root);
list.remove(0);
} else {
for (TreeNode parent : parents) {
if (list.size() > 0) {
TreeNode left = TreeNode.builder().data(list.get(0)).index(2 * parent.getIndex() + 1).build();
parent.setLeft(left);
nodes.add(left);
list.remove(0);
}
if (list.size() > 0) {
TreeNode right = TreeNode.builder().data(list.get(0)).index(2 * parent.getIndex() + 2).build();
parent.setRight(right);
nodes.add(right);
list.remove(0);
}
}
}
addAll(nodes, list);
}
/**
* 先序遍历
*
* @param node 父节点
*/
public static void preOrder(TreeNode node) {
if (node == null) {
return;
}
System.out.print(node.getData());
preOrder(node.getLeft());
preOrder(node.getRight());
}
/**
* 中序遍历
*
* @param node 父节点
*/
public static void middleOrder(TreeNode node) {
if (node == null) {
return;
}
middleOrder(node.getLeft());
System.out.print(node.getData());
middleOrder(node.getRight());
}
/**
* 后序遍历
*
* @param node 父节点
*/
public static void postOrder(TreeNode node) {
if (node == null) {
return;
}
postOrder(node.getLeft());
postOrder(node.getRight());
System.out.print(node.getData());
}
}