题目:重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
前序遍历:中左右
中序遍历:左中右
根据pre[0]=vin[i]找出根(mid)的位置,递归左右子树
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):
val(x), left(NULL), right(NULL){
}
};
class Solution{
public:
// 思路:递归左右子树,找出左右的pre和vin
TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> vin){
int mid, size=pre.size();
if(size==0) return NULL;
TreeNode *root = new TreeNode(pre[0]);
// 找mid的位置
for(int i=0;i<size;i++){
if(pre[0]==vin[i]){
mid=i;break;
}
}
// 定义l_pre,l_vin,r_pre,r_vin;
vector<int> l_pre,l_vin,r_pre,r_vin;
for(int i=0;i<mid;i++){
l_pre.push_back(pre[i+1]);
l_vin.push_back(vin[i]);
}
for(int i=mid+1;i<size;i++){
r_pre.push_back(pre[i]);
r_vin.push_back(vin[i]);
}
//递归找出左右子树
root->left = reConstructBinaryTree(l_pre, l_vin);
root->right = reConstructBinaryTree(r_pre, r_vin);
return root;
}
};
//根据建的树,进行层次遍历和后序遍历,检验结果。
vector<int> leaveTraversal(TreeNode *root){
vector<int> res;
if(root == NULL) return res;
TreeNode *now = root;
queue<TreeNode *> q;
q.push(now);
while(!q.empty()){
now = q.front();
res.push_back(now->val);
q.pop();
if(now->left!=NULL)
q.push(now->left);
if(now->right!=NULL)
q.push(now->right);
}
cout<<"层次遍历:";
for(int i=0;i<res.size();i++)
cout<<res[i]<<" ";
cout<<endl;
return res;
}
void postorderTraversal(TreeNode *root){
//递归
if(root!=NULL){
postorderTraversal(root->left);
postorderTraversal(root->right);
cout<<root->val<<" ";
}
}
int main(){
vector<int>p={1,2,4,7,3,5,6,8}, v={4,7,2,1,5,3,8,6};
Solution s;
TreeNode *r = s.reConstructBinaryTree(p,v);
leaveTraversal(r);
postorderTraversal(r);
return 0;
}
来源:CSDN
作者:Vvissions
链接:https://blog.csdn.net/weixin_38603360/article/details/104050905