輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
該題目用到了遞迴分治的思想。先序遍歷二叉樹的第乙個節點肯定是根節點,那麼在中序序列中找到先序的對應資料的下標。根據前序和中序遍歷的性質可知,下標左側的資料是左子樹,下標右側的資料是右子樹。同時,下標左側元素的個數是左子樹元素的個數,所以根據這個來劃分先序序列的左子樹部分;下標右側的資料的個數是右子樹元素的個數,同理劃分前序序列右子樹部分。遞迴的求解左右子樹,把子序列放入遞迴函式中求解。遞迴終止的情況是沒有資料可以劃分了,此時返回空值。
**中需要注意的是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...