Code & Func
2017-10-25

第32天。

其实早在很久之前了就想着坚持了一个月之后要发票圈纪念一下的,后来想想其实也没啥必要的,感觉每天早上起来开电脑看题目已经成了习惯了,习惯有啥好纪念的(其实到100天的时候应该还是挺有意义的)。

今天的题目是Construct Binary Tree from Preorder and Inorder Traversal

Given preorder and inorder traversal of a tree, construct the binary tree.

Note: You may assume that duplicates do not exist in the tree.

一开始没看到Note,还觉得会有点麻烦,不过既然没有重复元素,写出一个递归解法就很简单了:

1
TreeNode* buildTree1(vector<int>& preorder, vector<int>& inorder) {
2
return bulidTreeIter(preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
3
}
4
TreeNode *bulidTreeIter(vector<int>::iterator pBeg,vector<int>::iterator pEnd,vector<int>::iterator iBeg,vector<int>::iterator iEnd) {
5
if (pEnd == pBeg) return nullptr;
6
TreeNode *root = new TreeNode(*pBeg);
7
auto it = find(iBeg,iEnd,*pBeg);
8
int size = it - iBeg;
9
root->left = bulidTreeIter(pBeg+1,pBeg + size + 1,iBeg,it);
10
root->right = bulidTreeIter(pBeg+size+1,pEnd,it+1,iEnd);
11
return root;
12
}

恩,貌似是第一次一次Submit就直接过。

然后是在dicuss中看到的迭代算法,但是感觉很复杂的样子,而且效率也不一定比递归版的高。

1
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
2
3
if(preorder.size()==0)
4
return NULL;
5
6
stack<int> s;
7
stack<TreeNode *> st;
8
TreeNode *t,*r,*root;
9
int i,j,f;
10
11
f=i=j=0;
12
s.push(preorder[i]);
13
14
root = new TreeNode(preorder[i]);
15
st.push(root);
37 collapsed lines
16
t = root;
17
i++;
18
19
while(i<preorder.size())
20
{
21
if(!st.empty() && st.top()->val==inorder[j])
22
{
23
t = st.top();
24
st.pop();
25
s.pop();
26
f = 1;
27
j++;
28
}
29
else
30
{
31
if(f==0)
32
{
33
s.push(preorder[i]);
34
t -> left = new TreeNode(preorder[i]);
35
t = t -> left;
36
st.push(t);
37
i++;
38
}
39
else
40
{
41
f = 0;
42
s.push(preorder[i]);
43
t -> right = new TreeNode(preorder[i]);
44
t = t -> right;
45
st.push(t);
46
i++;
47
}
48
}
49
}
50
51
return root;
52
}
上一条动态