赞
踩
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
代码:
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode() {}
- * TreeNode(int val) { this.val = val; }
- * TreeNode(int val, TreeNode left, TreeNode right) {
- * this.val = val;
- * this.left = left;
- * this.right = right;
- * }
- * }
- */
- class Solution {
- public TreeNode buildTree(int[] preorder, int[] inorder) {
- if(preorder.length==0){//判断数组长度,如果为零,说明没有了
- return null;
- }
- int rootValue=preorder[0];//从先序遍历中获得父亲结点的值
- TreeNode node=new TreeNode(rootValue);//创建结点
- for(int i=0;i<inorder.length;i++){
- if(inorder[i]==rootValue){//从中序遍历中找到父亲节点的值,划分为左子树和右子树
- int[] preLeft = Arrays.copyOfRange(preorder, 1, i+1);//先序遍历中左子树的部分
- int[] preRight = Arrays.copyOfRange(preorder, i+1, preorder.length);//先序遍历中右子树的部分
-
- int[] inLeft = Arrays.copyOfRange(inorder, 0, i);//中序遍历中左子树的部分
- int[] inRight = Arrays.copyOfRange(inorder, i + 1, inorder.length);//中序遍历中左子树的部分
-
- node.left = buildTree(preLeft, inLeft);//递归调用左子树
- node.right=buildTree(preRight,inRight);//递归调用右子树
- break;//减少不必要的遍历
- }
- }
- return node;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。