【題目描述】
Given preorder and inorder traversal of a tree, construct the binary tree.
Notice:You may assume that duplicates do not exist in the tree.
根據前序遍歷和中序遍歷樹構造二叉樹.
注意:你可以假設樹中不存在相同數值的節點
【題目鏈接】
www.lintcode.com/en/problem/construct-binary-tree-from-preorder-and-inorder-traversal/
【題目解析】
相信學過數據結構的同學應該都對這道題目有深刻的印象,雖然它是二叉樹的題目,但是其更多使用到的還是分治的思想。
對于給定的前序遍歷preorder和中序遍歷inorder,首先我們不難發現,這棵樹的根結點其實就是preorder[0]。由于preorder和inorder是對同一棵樹的遍歷,我們可以知道preorder[0]在inorder中一定也存在,不妨設preorder[0]==inorder[k]。
由于inorder是中序遍歷,所以k左邊的就是根節點左子樹的中序遍歷、k右邊的就是根節點右子樹的中序遍歷。
并且,由于我們已經知道了根節點左子樹的節點數(與中序遍歷長度相同),不妨設為l,我們可以知道preorder從1到l+1就是根節點左子樹的前序遍歷,剩下的最后一部分就是根節點右子樹的前序遍歷。
也就是說,我們可以計算出左子樹、右子樹的前序遍歷和中序遍歷,從而可以用分治的思想,將規模較大的問題分解成為兩個較小的問題,然后遞歸的進行處理,還原左子樹和右子樹,最后連通根節點一起組成一棵完整的樹。
【參考答案】
www.jiuzhang.com/solutions/construct-binary-tree-from-preorder-and-inorder-traversal/