1. 程式人生 > 其它 >劍指 Offer 07 重建二叉樹

劍指 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,作為上一層根節點的左右子樹的根節點。(有了根節點其餘的節點也就帶上了)