从中序与后序遍历序列构造二叉树(Java)
从中序与后序遍历序列构造二叉树(Java)
大体思路:从后序数组中找到最后一个元素的值,即为当前节点并进行节点的创建,并在中序数组中找到该值所在索引(使用Map)。接着开始递归,后序数组倒着向前(所以递归应该先从右子树开始),当右子树遍历完(即不存在遍历区间时left>right)return。
问题分析:
- 返回值:返回最终头节点;
- 参数:由于需要遍历区间,所以定义两个参数left、right,至于map, postorder作为全局变量使用。
/**
* 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 {
Map<Integer, Integer> map = new HashMap<>();
int[] postorder;
int postindex;
public TreeNode buildTree(int[] inorder, int[] postorder) {
this.postorder = postorder;
postindex = postorder.length - 1;
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i], i); // 通过值找索引(而且题目中表示值不会相同)
}
return treeBuild(0, postindex);
}
public TreeNode treeBuild(int left, int right //注意这个是inorder的左右区间 ){
if(left > right){
return null;
}
int rootval = postorder[postindex--];
TreeNode root = new TreeNode(rootval); //创建节点
int mid = map.get(rootval); //中序的切割点
root.right = treeBuild(mid + 1, right);
root.left = treeBuild(left, mid - 1);
return root;
}
}
从前序与中序遍历序列构造二叉树(Java)
思路分析:整体思路类似上一题,只不过这次先序遍历数组中的顺序是中左右,所以根节点是在最前边,同时递归时注意先左子树后右子树
/**
* 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 {
Map<Integer, Integer> map = new HashMap<>();
int[] preorder;
int i = 0; // 记录先序数组中的中间节点的索引
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i], i);
}
return fucTree(0, preorder.length - 1);
}
public TreeNode fucTree(int left, int right){
if(left > right){
return null;
}
int rootval = preorder[i++];
TreeNode root = new TreeNode(rootval);
int mid = map.get(rootval);
root.left = fucTree(left, mid - 1);
root.right = fucTree(mid + 1, right);
return root;
}
}