//============================================================================
// Name : reversestring.cpp
// Author : qxyu
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<unordered_map>
//#include<uint32_t>
using namespace std;
/**
* Definition for a point.
*/
struct Treenode{
Treenode* left;
Treenode* right;
int val;
Treenode(int x):left(NULL),right(NULL),val(x){}
};
Treenode* constructTree(vector<int>& preorder, vector<int>& inorder, int p_left, int p_right, int i_left, int i_right){
if(preorder.size()==0||inorder.size()==0||preorder.size()!=inorder.size()) return NULL;
Treenode* root = new Treenode(preorder[p_left]);
if(p_left>=p_right||i_left>=i_right) return root;
int i = i_left;
for(; i <= i_right; i ++){
if(inorder[i]==preorder[p_left])
break;
}
int left_length=i-i_left;
cout<<"i:"<<i<<endl;
cout<<"left_length:"<<left_length<<endl;
int right_length=i_right-i;
cout<<"right_length:"<<right_length<<endl;
p_left++;
p_right=p_left+left_length-1;
i_left=i-left_length;
i_right=i-1;
Treenode* l_left=constructTree(preorder, inorder, p_left, p_right, i_left, i_right);
p_left=p_right+1;
p_right=p_left+right_length-1;
i_left=i+1;
i_right=i_left+right_length-1;
Treenode* r_right=constructTree(preorder, inorder, p_left, p_right, i_left, i_right);
root->left=l_left;
root->right=r_right;
//return root;
}
vector<int> preorder_recursive(Treenode* root){
vector<int> res;
if(root == NULL) return res;
stack<Treenode*> s;
Treenode* t = root;
while(t||!s.empty()){
while(t){
s.push(t);
res.push_back(t->val);
t=t->left;
}
t=s.top();
s.pop();
t=t->right;
}
return res;
}
int main()
{
vector<int> pre;
pre.push_back(1);
pre.push_back(2);
pre.push_back(4);
pre.push_back(7);
pre.push_back(3);
pre.push_back(5);
pre.push_back(6);
pre.push_back(8);
vector<int> in;
in.push_back(4);
in.push_back(7);
in.push_back(2);
in.push_back(1);
in.push_back(5);
in.push_back(3);
in.push_back(8);
in.push_back(6);
Treenode* r =constructTree(pre,in,0,7,0,7);
// cout<<r->right->val;
vector<int> output=preorder_recursive(r);
for(int i = 0; i < output.size(); i ++)
cout<<output[i]<<" ";
return 0;
}
根据前序,中序遍历构造二叉树,目前有问题,莫名多出两个节点
最新推荐文章于 2021-04-13 11:04:09 发布