問題描述:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
解題思路:
前序遍歷性質:節點按照[ 根節點 | 左子樹 | 右子樹 ]
排序。
中序遍歷性質:節點按照[ 左子樹 | 根節點 | 右子樹 ]
排序。
根據以上性質,可得出以下推論:
前序遍歷的首元素 為 樹的根節點 node 的值。在中序遍歷中搜尋根節點 node 的索引 ,可將 中序遍歷 劃分為 [ 左子樹 | 根節點 | 右子樹 ] 。
根據中序遍歷中的左 / 右子樹的節點數量,可將 前序遍歷 劃分為 [ 根節點 | 左子樹 | 右子樹 ]。
以上子樹的遞推性質是分治演算法的體現,考慮通過遞迴對所有子樹進行劃分。
分治演算法解析:遞推引數:根節點在前序遍歷的索引遞推工作:root
、子樹在中序遍歷的左邊界left
、子樹在中序遍歷的右邊界right
;終止條件:當
left > right
,代表已經越過葉節點,此時返回nullptr
;題解:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
return recur(0, 0, this->preorder.size() - 1);
}private:
vectorpreorder;
unordered_mapinorder;
treenode* recur(int root, int left, int right)
};
leetcode 劍指 Offer 專題(七)
劍指 offer 專題第七部。題目 劍指 offer 66.構建乘積陣列。定義 begin v 1 i prod a k a 0 times a 1 times dots times a i 1 quad v 1 0 1 v 2 i prod a k a i 1 times dots times a...
leetcode劍指offer 字串
二叉樹,鍊錶,字串 思路 進行兩次反轉 1.對整個句子反轉 2.對句子中的單詞反轉 經過三次反 1.反轉前面的字串。2.反轉後面的字串。3.反轉整個字串 不能直接用力扣46全排列的 力扣46是無重複的數字,這個題是有重複的。正確的解法 不用not in tmp來判斷這個字母是否需要遍歷,定義乙個us...
Leetcode劍指offer系列 平衡二叉樹
傳送門 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,nul...