/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//这题是我遇到解答最难的一道题,我一度刷题想要放弃,今天下定决心搞出来
//整个算法思想:前序遍历[根节点|左子树|右子树];中序遍历[左子树|根节点|右子树];
//定义root为前序遍历中根节点位置,定义left为中序遍历中子树左边界,定义right为中序遍历中子树右边界
//首先根据前序遍历中根节点位置找到中序遍历中根节点位置可以把中序遍历划分开来,
//再根据左右子树元素数量,划分前序遍历。最后得出,左右子树分别的前序根节点,中序左右边界。
//在回溯时,新建头节点,还原二叉树。
//定一个数组,目的是为了resur递归这个函数可以使用到这个数组
int preorder[];
//建立实例引用变量是为了方法间共享
Map<Integer,Integer> maplist = new HashMap<Integer,Integer>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;//通过this变量把传进来的引用拷贝一下
for(int i = 0; i < inorder.length; i++){
maplist.put(inorder[i] , i);
//做一个值到索引的映射,可以通过值直接找到中序遍历中的索引位置
}
return resur(0, 0, preorder.length - 1);
}
public TreeNode resur(int root, int left, int right){
if(left > right) { return null;}//终止条件
TreeNode node = new TreeNode(preorder[root]);//回溯的时候建立二叉树
int i = maplist.get(preorder[root]);
//通过前序遍历中的值,直接找到中序遍历中的索引
node.left = resur(root + 1, left, i - 1);//递归左子树
node.right = resur(root - left + i + 1, i + 1, right);//递归右子树
return node;
}
}
剑指offer 07重建二叉树(根据前序、中序遍历)草真tm难
最新推荐文章于 2023-05-07 16:17:22 发布