失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 剑指offer 07重建二叉树(根据前序 中序遍历)草真tm难

剑指offer 07重建二叉树(根据前序 中序遍历)草真tm难

时间:2019-07-02 07:58:36

相关推荐

剑指offer 07重建二叉树(根据前序 中序遍历)草真tm难

/*** 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难》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。