劍指Offer之重建二叉樹

2021-08-28 06:51:43 字數 2988 閱讀 8819

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

該題目用到了遞迴分治的思想。先序遍歷二叉樹的第乙個節點肯定是根節點,那麼在中序序列中找到先序的對應資料的下標。根據前序和中序遍歷的性質可知,下標左側的資料是左子樹,下標右側的資料是右子樹。同時,下標左側元素的個數是左子樹元素的個數,所以根據這個來劃分先序序列的左子樹部分;下標右側的資料的個數是右子樹元素的個數,同理劃分前序序列右子樹部分。遞迴的求解左右子樹,把子序列放入遞迴函式中求解。遞迴終止的情況是沒有資料可以劃分了,此時返回空值。

**中需要注意的是vector的下標,這是最容易出錯的地方,沒有把握的情況就找乙個簡單的例子測試一下。還有,遞迴的時候vector的資料是拷貝的,這對效率有一定的影響,不過題目是這麼給的,肯定不會超時了。

/**

* definition for binary tree

* struct treenode

* };

*/class solution

int r =0;

for(r =

0; r < vin.

size()

; r++)}

treenode *root = new treenode

(pre[0]

);vector<

int>

preleft

(pre.

begin()

+1, pre.

begin()

+ r +1)

;// 左子樹前序

vector<

int>

vinleft

(vin.

begin()

, vin.

begin()

+ r)

;// 左子樹前序中序

vector<

int>

preright

(pre.

begin()

+ r +

1, pre.

end())

;// 右子樹前序

vector<

int>

vinright

(vin.

begin()

+ r +

1, vin.

end())

;// 右子樹中序

root->left =

reconstructbinarytree

(preleft, vinleft)

; root->right =

reconstructbinarytree

(preright, vinright)

;return root;}}

;

#include

#include

using namespace std;

struct treenode };

// 前序序列建樹,空節點輸入0

treenode*

createtree()

treenode* r = new treenode

(n);

r->left =

createtree()

; r->right =

createtree()

;}// 前序遍歷

void

preorder

(treenode* root)

cout << root->val <<

" ";

preorder

(root->left)

;preorder

(root->right);}

class solution

int r =0;

for(r =

0; r < vin.

size()

; r++)}

treenode *root = new treenode

(pre[0]

);vector<

int>

preleft

(pre.

begin()

+1, pre.

begin()

+ r +1)

;// 左子樹前序

vector<

int>

vinleft

(vin.

begin()

, vin.

begin()

+ r)

;// 左子樹前序中序

vector<

int>

preright

(pre.

begin()

+ r +

1, pre.

end())

;// 右子樹前序

vector<

int>

vinright

(vin.

begin()

+ r +

1, vin.

end())

;// 右子樹中序

root->left =

reconstructbinarytree

(preleft, vinleft)

; root->right =

reconstructbinarytree

(preright, vinright)

;return root;}}

;int

main()

; vector<

int>vin

; solution so =

solution()

; treenode *r = so.

reconstructbinarytree

(pre, vin)

;preorder

(r);

return0;

}

劍指offer之重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。definition for binary tree public class treenode public class solu...

劍指offer 重建二叉樹

重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...

《劍指offer》重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,則重建二叉樹並返回。輸入乙個樹的前序和中序,例如輸入前序遍歷序列和中序遍歷序列 根據輸入的前序和中序,重建乙個該二叉樹,並返回該樹的根節點。definition for binary...