劍指offer 007(重建二叉樹)

2021-08-18 23:52:18 字數 1807 閱讀 9693

更多題目:《 劍指offer》 目錄索引

問題描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸

入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並輸出它的頭結點。

思路:

前序遍歷的第乙個節點為二叉樹的頭節點

根據頭節點在中序遍歷中找出頭節點,並以此為分界點劃分左子樹和右子樹

由於前序遍歷都是先遍歷子樹的頭節點,故此在前序中找左子樹的頭節點,和右子樹的頭節點

根據頭節點在中序遍歷中找尋分界點,劃分左子樹和右子樹,依次類推

}//儲存左子樹長度

int leftlen = inorder - startinorder;

//儲存右子樹根,中序找到根後,左邊為左子樹,對應前序中除去根節點和左子樹,即為右子樹的第乙個節點

int* righttree = startpreorder + leftlen ;

//建立左子樹,左子樹的前序為,第二個+節點數(長度),中序為第乙個節點---根節點的前乙個

if (leftlen > 0)

//建立右子樹,前序為,根節點+左子樹節點(長度)-----最後,中序為根節點的下乙個----最後

if (leftlen < endpreorder - startpreorder)

return root;

}void test()

; int inoeder = ;

int len = sizeof(prevorder) / sizeof(prevorder[0]);

root = construct(prevorder, inoeder, len);

printf("%d\n", root->_data);

}void test1()

; int inorder[length] = ;

btnode* root = construct(preorder, inorder, length);

printf("%d\n", root->_data);

}void test2()

; int inorder[length] = ;

btnode* root = construct(preorder, inorder, length);

printf("%d\n", root->_data);

}void test3()

; int inorder[length] = ;

btnode* root = construct(preorder, inorder, length);

printf("%d\n", root->_data);

}void test4()

int main()

《劍指offer》 007 重建二叉樹

劍指offer 目錄索引 題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出圖所示的二叉樹並輸出它的頭結點。思路 遞迴實現,如下圖 如下 include include typedef s...

4 重建二叉樹(劍指offer)

4.重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。1 思路 通常樹有如下幾種遍歷方式 前序遍歷 先訪問根結點,再訪問左子結點,最後訪問右子結點。root一般在最前 中...

劍指offer 樹 7 重建二叉樹

使用雜湊表map記錄中序遍歷每個元素的位置 利用性質 1.先序遍歷的第乙個節點是根節點 2.中序遍歷的根節點的左邊是左子樹,右邊是右子樹 假設左子樹的中序遍歷的長度是len,在前序遍歷中,根節點後面len個數,是左子樹的前序遍歷,剩下的數是右子樹的前序遍歷 根據左右子樹的前序遍歷和中序遍歷,我們先遞...