import java.util.*;
public class code08 {
//根据中序序列和后序序列还原二叉树
public static class TreeNode {
int val;
int sum;
TreeNode left, right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
left = null;
right = null;
}
}
//层序遍历
public static void inOrder(TreeNode root, List<Integer> list) {
if (root == null)
return;
inOrder(root.left, list);
list.add(root.sum);
inOrder(root.right, list);
}
//根据中序序列和先序序列还原二叉树
public static TreeNode getBackTreeByInAndPre(List<Integer> inOrder, int inleft, int inright,
List<Integer> preOrder, int preleft, int preright) {
if (inOrder == null || inOrder.size() == 0 || preOrder == null || preOrder.size() == 0 || inOrder.size() != preOrder.size())
return null;
if (inleft > inright || preleft > preright)
return null;
if (inleft < 0 || preleft < 0)
return null;
TreeNode root = new TreeNode(preOrder.get(preleft));
int index = getIndex(inOrder, inleft, inright, root.val);
int leftSize = index - inleft;
TreeNode leftSon = getBackTreeByInAndPre(inOrder, inleft, index - 1, preOrder, preleft + 1, preleft + leftSize);
TreeNode rightSon = getBackTreeByInAndPre(inOrder, index + 1, inright, preOrder, preleft + leftSize + 1, preright);//用了以后就要少一个
int left = leftSon == null ? 0 : leftSon.sum + leftSon.val;
int right = rightSon == null ? 0 : rightSon.sum + rightSon.val;
root.sum = left + right;
root.left = leftSon;
root.right = rightSon;
return root;
}
//找到中序序列中根的位置
public static int getIndex(List<Integer> inOrder, int left, int right, Integer root) {
for (int i = left; i <= right; i++) {
if (Objects.equals(inOrder.get(i), root))
return i;
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Integer> inorder = new ArrayList<>();
List<Integer> preOrder = new ArrayList<>();
for (int i = 0; i < n; i++) {
inorder.add(sc.nextInt());
}
for (int i = 0; i < n; i++) {
preOrder.add(sc.nextInt());
}
TreeNode root = getBackTreeByInAndPre(inorder, 0, n - 1, preOrder, 0, n - 1);
List<Integer> result = new ArrayList<>();
inOrder(root, result);
for (Integer num : result) {
System.out.print(num + " ");
}
}
}
二叉树的计算
最新推荐文章于 2024-09-14 19:44:09 发布
该篇文章详细介绍了如何使用Java编程语言,通过中序遍历和先序遍历的顺序重建一棵二叉树。方法涉及递归函数,如`getBackTreeByInAndPre`,以及辅助函数`getIndex`来定位根节点在中序序列中的位置。
摘要由CSDN通过智能技术生成