題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如:輸入前序遍歷序列{1,2,4,7,3,5,6,8}
structbinarytreenode
;
在二叉樹的前序遍歷序列中,第乙個數字總是樹的根節點的值。但在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的值位於根節點的值的左邊,右子樹的節點的值位於根節點的值的右邊。因此我們需要掃瞄中序遍歷序列,才能找到根節點的值。
前序遍歷序列的第乙個數字1就是根節點的值。掃瞄中序遍歷序列,就能確定根節點的值的位置。根據中序遍歷的特點,在根節點的值1前面的3個數字都是左子樹節點的值,位於1後面的數子都是右子樹節點的值。
由於在中序遍歷序列中,有3個數字是左子樹節點的值,因此左子樹共有3個左子節點。同樣,在前序遍歷序列中,根節點很後面的3個數字就是3個左子樹的節點的值,再後面的所有數字都是右子樹的值。這樣我們就在前序遍歷和中序遍歷兩個序列中分別找到了左、右子樹對應的子串行。
既然我們已經分別找到了左、右子樹的前序遍歷序列和中序遍歷序列,我們可以用同樣的方法分別構建左右子樹。也就是說,接下來的事情可以用遞迴的方式去完成。
在想清楚如何在前序遍歷和中序遍歷序列中確定左、右的子串行之後,我們可以寫出如下的遞迴**:
binarytreenode* construct(int* preorder, int* inorder, intlength)
return constructcore(preorder, preorder + length - 1, inorder, inorder + length - 1);}
binarytreenode* constructcore(int* startpreorder, int* endpreorder, int* startinorder, int*endinorder)
else
}//在中序遍歷序列中找到根節點的值
int* rootinorder =startinorder;
while (rootinorder <= endinorder && *rootinorder !=rootvalue)
if (rootinorder == endinorder && *rootinorder !=rootvalue)
int leftlength = rootinorder -startinorder;
int* leftpreorderend = startpreorder +leftlength;
if (leftlength > 0
)
if (leftlength < endpreorder -startpreorder)
}
二叉樹 重建二叉樹
問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...
二叉樹 重建二叉樹
題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...
二叉樹重建
摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...