《劍指offer》 007 重建二叉樹

2021-08-18 12:31:54 字數 1907 閱讀 4561

《劍指offer》–目錄索引

題目:

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

思路:

遞迴實現,如下圖:

**如下:

#include 

#include

typedef

struct btreenode

btnode;

void btinit(btnode** root)

btnode* buybtnode(int data)

void destroytree(btnode* root)//銷毀二叉樹

btnode* constructcore(int* startpreorder, int* endpreorder, int* startinorder, int* endinorder);

btnode* construct(int* preorder, int* inorder, int length)

btnode* constructcore(int* startpreorder, int* endpreorder, int* startinorder, int* endinorder)

else

}int* inordernode = startinorder;//從中序序列陣列第乙個元素開始往後找與nodevalue值相同的元素

while (inordernode <= endinorder && *inordernode != nodevalue)

if (inordernode == endinorder && *inordernode != nodevalue)//如果找到中序序列最後乙個元素還沒找到,則中序序列不合法

int leftlength = inordernode - startinorder;//找到相同元素後,以該元素為分割點,儲存左邊陣列的長度

int* leftpreorderend = startpreorder + leftlength;//前序序列陣列中對應中序序列分割後的左邊陣列的部分的最後乙個元素位置

if (leftlength > 0)//構建左子樹

if (leftlength < endpreorder - startpreorder)//構建右子樹

return root;

}void test1()

; int inorder[8] = ;

printf("the preorder sequence is: ");

for (int i = 0; i < length; ++i)

printf("%d ", preorder[i]);

printf("\n");

printf("the inorder sequence is: ");

for (int i = 0; i < length; ++i)

printf("%d ", inorder[i]);

printf("\n");

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

destroytree(root);

}int main()

劍指offer 007(重建二叉樹)

更多題目 劍指offer 目錄索引 問題描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸 入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並輸出它的頭結點。思路 前序遍歷的第乙個節點為二叉樹的頭節點 根據頭節點在中序遍歷中找出頭節...

4 重建二叉樹(劍指offer)

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

劍指offer 樹 7 重建二叉樹

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