剑指 Offer 07 重建二叉树

用到的基础知识:

Java HashMap | 菜鸟教程 (runoob.com)                HashMap是一个散列表,他存储的内容是键值对(key-value)映射

HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

HashMap<Integer, String> Sites = new HashMap<Integer, String>();
//添加元素可以使用put()方法
map.put(1,"Google");
//访问元素可以使用get(key)方法来获取key对应的value
map.get(1);
//删除元素可以使用remove(key)方法来删除key对应的键值对(key-value)
map.remove(1);
//计算HashMap的大小可以使用size()方法
map.size();

 

 

 题解:面试题07. 重建二叉树(递归法,清晰图解) - 重建二叉树 - 力扣(LeetCode) (leetcode-cn.com)

 

前序遍历为:根左右         中序遍历为:左根右

前序遍历中的首个节点就是根节点,然后我们通过拿到的根节点可以在中序遍历中将树划分为左子树元素和右子树元素。要完成这一颗树的构建就分别需要完成左子树和右子树的构建,采用了递归的思想(树的题目一般都会采用到递归的思想)

子树的递推性质是分治思想的体现,考虑通过递归对所有子树进行划分。

分治算法解析:

①递归参数:前序遍历中的根节点的索引pre_root(这里在递推方法中用到了preorder数组所以需要在Solution方法中加一个属性来保存这一数组),树在中序遍历中的左边界in_left和右边界in_right,(这样就相当于框定了一个树的范围)

②终止的条件:当left > right,代表此时已经到达了叶子节点,叶子节点的左右子树都是null

③递推公式:

1. 建立根节点root, 节点的值为preorder[pre_root];

2.划分为左右子树,通过查找前序遍历中根节点在中序遍历的索引位置(通过HashMap来进行保存可以提高查找效率),in_root_index = map.get(preorder[pre_root])。

然后根据这个根节点分别构建其左右子树,这里我们就要用到左右子树的根节点了。

                     根节点索引            中序遍历左边界    中序遍历右边界
左子树           root + 1                        left                          i - 1
右子树      root + (i - left) + 1            i + 1                         right

依照这个在分别进行递归。

④返回值:回溯返回ListNode,作为上一层根节点的左右子树的根节点。(有了根节点其余的节点也就带上了)

 

posted @ 2021-06-27 17:51  PPJ~  阅读(40)  评论(0)    收藏  举报