題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
思路:設前序遍歷序列為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 ...