题目:
Given preorder and inorder traversal of a tree, construct the binary tree.
翻译:
用一个二叉树的前序遍历和中序遍历还原二叉树。
思路:
这道题是一道比较基础的题。首先要弄清楚什么是前序遍历和中序遍历。前序遍历就是先遍历当前的节点,然后遍历该节点的左分支(即遍历左分支的所有节点),最后再遍历该节点的右分支。中序遍历是先遍历当前节点的左分支,再遍历当前节点,最后遍历当前节点的右分支。还有后序遍历,就是先右分支,再左分支,最后当前节点。比如下面这个二叉树的。前序遍历为ABDGHECKFIJ,中序遍历为GDHBEAKCIJF,后序遍历为GHDEBKJIFCA。具体的怎么由前序和中序(或者中序和后序)遍历还原出二叉树,可以参考这篇:http://bbs.51cto.com/thread-892707-1.html。虽说在纸上画出二叉树不难,但是代码实现其实还是有些难度的。
我们知道前序遍历的第一个数字一定是头节点,中序遍历输出某个数字的时候一定是该数字的左边分支已经遍历结束。因此我们可以设计一个栈,当前序遍历的第i位与当前中序遍历的第j位相同时,遍历该元素的右分支,并且栈顶元素出栈。具体可以结合代码理解。
代码:
<span style="font-size:18px;">class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
if(preorder.size()==0)
return NULL;
TreeNode* root;
stack<TreeNode*> st;
TreeNode* tr;
int i,j,k;
k=i=j=0;
root=new TreeNode(preorder[i]);
st.push(root);
tr=root;
i++;
while(i<preorder.size())
{
if (!st.empty() && st.top()->val==inorder[j])
{
tr=st.top();
st.pop();
k=1;
j++;
}
else
{
if (k==0)
{
tr->left=new TreeNode(preorder[i]);
i++;
tr=tr->left;
st.push(tr);
}
else
{
tr->right=new TreeNode(preorder[i]);
i++;
tr=tr->right;
st.push(tr);
k=0;
}
}
}
return root;
}
};</span>
结果: