劍指offer04 重建二叉樹

2022-05-16 09:41:07 字數 2309 閱讀 5310

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

思路:設前序遍歷序列為pre,中序遍歷序列為in,則易知:

1)root = pre[0];

2)in[ ] 中 root 的位置(索引)將 in[ ] 分成了root 的左子樹和右子樹兩個部分;

如圖所示:先序中的第乙個元素就是樹的根root 1,在中序中這個根 1 將序列分為了左(4,7,2)、右(5,3,8,6)子樹;

遞迴的看,左子樹也有先序(2,4,7)和中序(4,7,2)兩個序列,右子樹同理;

18 // 遞迴退出條件

19if(pre.size() == 0

) 22 // 中序中root的位置

23int

i;24

for(i = 0; i < vin.size(); i++)

25if(vin[i] == pre[0

])26

break;27

28 vectorinleft;

29 vectorpreleft;

30 vectorinright;

31 vectorpreright;

32 // 左子樹的先序和中序序列

33for(int j = 0; j < i; j++)

37 // 右子樹的先序和中序序列

38for(int j = 0; j < vin.size()-i-1; j++)

4243 treenode *root = new treenode(pre[0

]);44 root->left =reconstructbinarytree(preleft, inleft);

45 root->right =reconstructbinarytree(preright, inright);

4647

return

root;48}

49 };

1

/**2

* definition for binary tree

3* public class treenode

8* }9*/

10public

class

solution

1819

//遞迴退出條件

20if(pre.length == 0)

21return

null;22

23//

中序中root的索引

24int

i;25

for(i = 0; i < in.length; i++)

26if(in[i] == pre[0])

27break;28

29int inleft = new

int[i];

30int preleft = new

int[i];

31int inright = new

int[in.length-i-1];

32int preright = new

int[in.length-i-1];

3334

//左子樹的中序和先序序列

35for(int j = 0; j < i; j++)

3940

//右子樹的中序和先序序列

41for(int j = 0; j < in.length-i-1; j++)

4546 treenode root = new treenode(pre[0]);

47 root.left =reconstructbinarytree(preleft, inleft);

48 root.right =reconstructbinarytree(preright, inright);

4950

return

root;51}

52 }

演算法的改進:

劍指Offer(04) 重建二叉樹

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

劍指offer04 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。首先要知道二叉樹的三種遍歷方式 先序 中序 後序 先序 根左右 中序 左根右 後序 左右根 如何根據先序和中序 或者中序和後續 重建...

劍指offer04重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。通過前序的第乙個點,對中序切分 左半邊和右半邊,然後對前序也切分為左半邊和右半邊,遞迴 definition for binary ...