题目
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
限制:
0 <= 节点个数 <= 5000
C++
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode{
int value;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : value(x){}
};
TreeNode* helper(vector<int> preorder, vector<int> inorder, int index, int start, int end){
if (start>end) return NULL;
int j = 0;
while (j<preorder.size() && preorder[index] != inorder[j]){j++;}
TreeNode* root = new TreeNode(preorder[index]);
root->left = helper(preorder, inorder, index+1, start, j-1);
root->right = helper(preorder, inorder, index+1+j-start, j+1, end);
return root;
}
TreeNode* buildTree(vector<int> preorder, vector<int> inorder){
return helper(preorder, inorder, 0, 0, preorder.size()-1);
}
void prePrint(TreeNode* root){
if (root == NULL) return;
cout<<root->value<<endl;
prePrint(root->left);
prePrint(root->right);
}
int main(){
vector<int> preorder = {1, 2, 4, 8, 5, 3, 6, 7, 9};
vector<int> inorder = {8, 4, 2, 5, 1, 6, 3, 7, 9};
TreeNode* root = buildTree(preorder, inorder);
prePrint(root);
system("pause");
return 0;
}
Java
package offerseven;
public class offerseven{
public static class TreeNode{
int value;
TreeNode left;
TreeNode right;
TreeNode(int x) {value = x;}
}
public static TreeNode bulidTree(int []preorder, int []inorder){
return helper(preorder, inorder, 0, 0, preorder.length-1);
}
public static TreeNode helper(int []preorder, int []inorder, int index, int start, int end){
if (start > end) return null;
int j = 0;
while (j < preorder.length && preorder[index] != inorder[j]) {
j++;
}
TreeNode root = new TreeNode(preorder[index]);
root.left = helper(preorder, inorder, index+1, start, j-1);
root.right = helper(preorder, inorder, index+1+j-start, j+1, end);
return root;
}
public static void prePrint(TreeNode root){
if (root == null) return;
System.out.println(root.value);
prePrint(root.left);
prePrint(root.right);
}
public static void main(String[] args) {
int []preorder = new int[]{1, 2, 4, 8, 5, 3, 6, 7, 9};
int []inorder = new int[]{8, 4, 2, 5, 1, 6, 3, 7, 9};
TreeNode root = bulidTree(preorder, inorder);
prePrint(root);
}
}
Python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def buildTree(preorder, inorder):
def helper(preorder, inorder, index, start, end):
if start > end:
return None
root = TreeNode(preorder[index])
j = start
while j < end and preorder[index] != inorder[j]:
j += 1
root.left = helper(preorder, inorder, index+1, start, j-1)
root.right = helper(preorder, inorder, index+1+j-start, j+1, end)
return root
return helper(preorder, inorder, 0, 0, len(preorder)-1)
def prePrint(root):
if root == None:
return
print(root.val)
prePrint(root.left)
prePrint(root.right)
preorder = [1, 2, 4, 8, 5, 3, 6, 7, 9]
inorder = [8, 4, 2, 5, 1, 6, 3, 7, 9]
root = buildTree(preorder, inorder)
prePrint(root)
Go
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func buildTree(preorder []int, inorder []int) *TreeNode {
return helper(preorder, inorder, 0, 0, len(preorder)-1)
}
func helper(preorder, inorder []int, index, start, end int) *TreeNode {
if start > end {
return nil
}
root := &TreeNode{Val: preorder[index]}
j := start
for j < end && preorder[index] != inorder[j] {
j++
}
root.Left = helper(preorder, inorder, index+1, start, j-1)
root.Right = helper(preorder, inorder, index+1+j-start, j+1, end)
return root
}
func prePrint(root *TreeNode) {
if root == nil {
return
}
fmt.Println(root.Val)
prePrint(root.Left)
prePrint(root.Right)
}
func main() {
preorder := []int{1, 2, 4, 8, 5, 3, 6, 7, 9}
inorder := []int{8, 4, 2, 5, 1, 6, 3, 7, 9}
root := buildTree(preorder, inorder)
prePrint(root)
}