更多題目:《 劍指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個數,是左子樹的前序遍歷,剩下的數是右子樹的前序遍歷 根據左右子樹的前序遍歷和中序遍歷,我們先遞...