前序与后续遍历二叉树
构造过程
可以通过前序遍历序列和后序遍历序列构造一棵二叉树的过程如下:
- 前序遍历序列的第一个元素是根节点的值,创建一个新的节点并将该值赋给节点的值。
- 在后序遍历序列中找到该根节点的值。
- 将后序遍历序列分成根节点左边的部分和右边的部分。左边部分是根节点的左子树的后序遍历序列,右边部分是根节点的右子树的后序遍历序列。
- 根据左子树的后序遍历序列和前序遍历序列,递归地构造左子树。
- 根据右子树的后序遍历序列和前序遍历序列,递归地构造右子树。
- 将左子树和右子树连接到根节点上。
使用Java通过前序遍历序列和后序遍历序列构造二叉树的示例代码
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length != inorder.length) {
return null;
}
int preStart = 0;
int preEnd = preorder.length - 1;
int inStart = 0;
int inEnd = inorder.length - 1;
return buildTreeHelper(preorder, preStart, preEnd, inorder, inStart, inEnd);
}
private TreeNode buildTreeHelper(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return null;
}
int rootValue = preorder[preStart];
TreeNode root = new TreeNode(rootValue);
int rootIndex = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootValue) {
rootIndex = i;
break;
}
}
int leftSize = rootIndex - inStart;
root.left = buildTreeHelper(preorder, preStart + 1, preStart + leftSize, inorder, inStart, rootIndex - 1);
root.right = buildTreeHelper(preorder, preStart + leftSize + 1, preEnd, inorder, rootIndex + 1, inEnd);
return root;
}
}
在上述代码中,TreeNode
类表示二叉树的节点。buildTree
方法接收前序遍历序列和后序遍历序列作为输入,并调用buildTreeHelper
方法进行递归构造二叉树。buildTreeHelper
方法接收前序遍历序列的起始位置和结束位置,后序遍历序列的起始位置和结束位置作为输入,根据这些信息递归地构造二叉树。最终返回二叉树的根节点。
前序与中序遍历二叉树
构造过程
要通过前序遍历和中序遍历构造二叉树,可以按照以下步骤进行:
- 首先,从前序遍历中取出根节点的值,并创建一个新的节点来表示根节点。
- 在中序遍历中,找到根节点的位置,将中序遍历分为左子树和右子树的部分。
- 根据左子树部分的节点个数,可以确定前序遍历中左子树的范围。
- 递归地调用步骤1-3来构造左子树和右子树,分别将左子树和右子树的根节点连接到根节点上。
通过Java来实现通过前序和中序遍历构造二叉树的算法
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0) {
return null;
}
return buildTreeHelper(preorder, inorder, 0, 0, inorder.length - 1);
}
private TreeNode buildTreeHelper(int[] preorder, int[] inorder, int preStart, int inStart, int inEnd) {
if (preStart > preorder.length - 1 || inStart > inEnd) {
return null;
}
int rootVal = preorder[preStart];
TreeNode root = new TreeNode(rootVal);
int rootIndex = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
root.left = buildTreeHelper(preorder, inorder, preStart + 1, inStart, rootIndex - 1);
root.right = buildTreeHelper(preorder, inorder, preStart + rootIndex - inStart + 1, rootIndex + 1, inEnd);
return root;
}
}
使用示例:
public class Main {
public static void main(String[] args) {
int[] preorder = {3, 9, 20, 15, 7};
int[] inorder = {9, 3, 15, 20, 7};
Solution solution = new Solution();
TreeNode root = solution.buildTree(preorder, inorder);
}
}
通过给定的前序遍历和中序遍历,使用Solution
类中的buildTree
方法可以构建出相应的二叉树。