点击蓝色“五分钟学算法”关注我哟
加个“星标”,天天中午 12:15,一起学算法
作者 |程序员小吴
来源 | 五分钟学算法
题目描述
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如前序遍历前序遍历,给出
前序遍历 preorder = [28,16,13,22,30,29,43]
中序遍历 inorder = [13,16,22,28,29,30,43]
返回如下的二叉树:
28
/
16 30
/ /
13 22 29 43
题目解析
先来了解一下前序遍历、中序遍历、后序遍历是什么。
前序遍历:遍历顺序为 父(根)节点 -> 左子节点 -> 右子节点
中序遍历:遍历顺序为 左子节点 -> 父(根)节点 -> 右子节点
后序遍历:遍历顺序为 左子节点 -> 右子节点 -> 父(根)节点
再说明一个结论:前序/后序 + 中序遍历可以确定一棵唯一二叉树。
题目中给出的是 前序 + 中序 的组合,那么我们仔细观察对比一下 前序遍历 与 中序遍历。
如果我们要递归生成二叉树的话,下一层递归应该是:
两个注意点:
动画描述
图片描述
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//author:程序员小吴
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
//借助哈希表来储存二叉树的节点,优化时间复杂度
Map inPos = new HashMap();
for (int i = 0; i < inorder.length; ++i){
inPos.put(inorder[i], i);
}
return buildTree(preorder, 0, preorder.length-1, 0, inPos);
}
private TreeNode buildTree( int[] pre, int preStart , int preEnd, int inStart, Map inPos) {
//递归停止条件
if (preStart > preEnd) return null;
//前序中左起第一位肯定是根结点
TreeNode root = new TreeNode(pre[preStart]);
//根结点的位置直接通过中序获取
int rootIdx = inPos.get(pre[preStart]);
//左子树结点个数可以通过中序中根节点的位置与中序中起始位置确定
int leftLen = rootIdx - inStart;
//递归调用
root.left = buildTree(pre, preStart + 1, preStart + leftLen, inStart, inPos);
root.right = buildTree(pre, preStart + leftLen + 1, preEnd, rootIdx + 1, inPos);
return root;
}
}
复杂度分析知识点
二叉树、递归
热门推荐
1.【程序员】
2.【GitHub】
3.【算法】
4.【数据结构】
限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。