原题:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
题意:给你一个后序遍历和中序遍历的数组,要求构建二叉树
代码和思路:
【LeetCode 106】 后序遍历:就是先访问 左子树------右子树 ------根节点所以后序遍历数组的最后一个个数就是根节点。
中序遍历:就是先访问 左子树------根节点------右子树根节点在中间,左边是左子树,右边是右子树
[java]view plain
copy
- 4
- /\
- 27
- / \/ \
- 13 69
后序遍历的结果是:1326974
中序遍历的结果是:1234679可以看到4在最中间,2在13中间,7在69中间。这样就用迭代即可
代码跟105的基本一样,改少数几个地方即可
/**
* 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[] inorder, int[] postorder) {
return recursion(postorder.length-1,0,inorder.length-1,inorder,postorder);
}
private TreeNode recursion(int postLast,int inStart,int inEnd,int[] inorder, int[] postorder){
if(inStart > inEnd || postLast<0){
return null;
}TreeNode root = new TreeNode(postorder[postLast]);
int inIndex = 0;
for(int i = inStart;
i<=inEnd;
i++){
if(inorder[i]==root.val){
inIndex = i;
}
}
//左节点在后序遍历中的位置是 postLast-(inEnd-inIndex)-1
root.left = recursion(postLast-(inEnd-inIndex)-1,inStart,inIndex-1,inorder,postorder);
//右节点在后序遍历中的位置是 postLast-1
root.right = recursion(postLast-1,inIndex+1,inEnd,inorder,postorder);
return root;
}
}
推荐阅读
- 数据结构与算法|【算法】力扣第 266场周赛
- leetcode|今天开始记录自己的力扣之路
- Python|Python 每日一练 二分查找 搜索旋转排序数组 详解
- 【LeetCode】28.实现strstr() (KMP超详细讲解,sunday解法等五种方法,java实现)
- LeetCode-35-搜索插入位置-C语言
- leetcode python28.实现strStr()35. 搜索插入位置
- Leetcode Permutation I & II
- python|leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
- LeetCode 28 Implement strStr() (C,C++,Java,Python)
- Python|Python Leetcode(665.非递减数列)