劍指 Offer 07 重建二叉樹

2021-10-16 21:10:52 字數 1186 閱讀 9335

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

返回如下的二叉樹:

3/ \

9  20

/  \

15   7

根據前序序列找到根結點,再根據中序序列找到包括此根結點的全部結點,不斷重複此過程遞迴找到所有結點。

struct treenode ;

class solution

treenode* bt(vector& preorder, vector& inorder,int h1,int t1,int h2,int t2)

leftl = i-h2;

rightl = t2-i;

if(leftl>0)

else root->left = null;

if(rightl>0)

else root->right = null;

return root;

}/*迭代版,效率高

在先序遍歷中,前後緊鄰的兩個節點a和b,在樹中的位置有三種情況

1、b是a的左子樹節點(父子關係),對應a有左子樹

2、b是a的右子樹節點(父子關係),對應a沒有左子樹,但有右子樹

3、b是a的某個有右子樹的祖父節點,對應a既沒有左子樹,也沒有右子樹

因為在前序遍歷中,a的祖父節點和祖父節點的左子樹絕不可能在a的後面,

在中序遍歷中,前後緊鄰的兩個節點a和b,在樹中的位置有兩種情況:

1、b是a的右子樹中的最左側節點,對應a有右子樹(在a右子樹只有乙個節點的情況下,退化為b是a的右節點)

2、a是b的左子樹中的最右側節點,對應a沒有右子樹(在b的左子樹只有乙個節點的情況下,退化為a是b的左節點)

*/ //時間最快的解法

treenode* buildtree(vector& preorder, vector& inorder) else

cur = cur->right = new treenode(preorder[i]); //preorder[i]即當前節點的右子樹節點,並且下次從右子樹開始遍歷}}

return root;

}};

劍指offer07 重建二叉樹

這是乙個非常高頻的面試題。題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例子 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 思路 題目給出了前序和中序遍歷,我們可以知道前序的...

劍指 Offer 07 重建二叉樹

難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...

劍指 Offer 07 重建二叉樹

首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...