面试题07. 重建二叉树【LeetCode剑指offer】
程序员文章站
2022-06-17 16:58:31
...
题目:
思路:
- 要明白先序遍历和中序遍历的具体顺序,
- 先找到先序遍历的第一个元素,然后再去中序遍历里面查找这个元素,得到这个元素在中序的索引,那么,在中序数组中,这个元素前面的元素都是这个元素的左子树结点,这个元素的右边都是这个元素的右子树结点。
- 对这个元素的左子树结点数组进行递归,
- 对这个元素的右子树结点数组进行递归。
实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || preorder.length == 0) {
return null;
}
//对中序数组遍历,并将中序数组存入HashMap中保存,
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int len = preorder.length;
for (int i = 0; i < len; i++) {
map.put(inorder[i], i);
}
// 开始递归
TreeNode root = buildTree(preorder, 0, len - 1, inorder, 0, len - 1, map);
return root;
}
public TreeNode buildTree(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd, Map<Integer, Integer> map) {
if (preStart > preEnd) return null;
int rootVal = preorder[preStart];
TreeNode rootNode = new TreeNode(rootVal);
if (preStart == preEnd)
return rootNode;
else {
int rootIndex = map.get(rootVal);
int leftNodes = rootIndex - inStart;
int rightNodes = inEnd - rootIndex;
TreeNode leftTree = buildTree(preorder, preStart + 1, preStart + leftNodes, inorder, inStart, rootIndex - 1, map);
TreeNode rightTree = buildTree(preorder, preEnd - rightNodes + 1, preEnd, inorder, rootIndex + 1, inEnd, map);
rootNode.left = leftTree;
rootNode.right = rightTree;
return rootNode;
}
}
}
推荐阅读
-
《剑指offer》面试题6 重建二叉树
-
剑指 Offer 07. 重建二叉树——【前中序】和【中后序】重建二叉树的递归思路详解
-
leetcode 160剑指offer面试题52. 两个链表的第一个公共节点(python3)
-
leetcode 面试题32 (剑指offer)- II. 从上到下打印二叉树 II(python3)
-
leetcode 113 剑指offer 面试题34. 二叉树中和为某一值的路径(python3)
-
剑指offer-重建二叉树
-
剑指offer——面试题62:序列化二叉树
-
剑指offer 面试题62 序列化和反序列化二叉树
-
【剑指Offer】面试题62:序列化二叉树
-
【重点】剑指offer——面试题62:序列化二叉树