您的位置:首页 > 其它

判断整数序列是不是二元查找树的后序遍历结果

2013-04-10 20:37 239 查看
//实际上就是判断能否由后序和中序序列建树
#include <iostream>
using namespace std;
class BinTree{
public:
BinTree(int v){
value = v;
left = NULL;
right = NULL;
}
int value;
BinTree* left;
BinTree* right;
};
int* getPos(int* begin,int* end,int c) {
while(begin<=end) {
if(*begin == c)
return begin;
begin ++;
}
return NULL;
}
bool buildTree(BinTree* &tree,int* beginInOrder,int* endInOrder,int* beginPostOrder,int* endPostOrder){
if(beginInOrder > endInOrder || beginPostOrder > endPostOrder)
return true;
int value = *endPostOrder;
tree = new BinTree(value);
int* pos = getPos(beginInOrder,endInOrder,value);
if(!pos)
return false;
int* leftBeginInOrder = beginInOrder;
int* leftEndInOrder = pos - 1;
int* rightBeginInOrder = pos + 1;
int* rightEndInOrder = endInOrder;
int* leftBeginPostOrder = beginPostOrder;
int* leftEndPostOrder = leftBeginPostOrder + (leftEndInOrder - leftBeginInOrder);
int* rightBeginPostOrder = leftEndPostOrder + 1;
int* rightEndPostOrder = endPostOrder - 1;
bool leftRet = buildTree(tree->left,leftBeginInOrder,leftEndInOrder,leftBeginPostOrder,leftEndPostOrder);
bool rightRet = buildTree(tree->right,rightBeginInOrder,rightEndInOrder,rightBeginPostOrder,rightEndPostOrder);

return leftRet&&rightRet;
}
void print(BinTree* tree) {
cout<<tree->value<<endl;
}
void inOrder(BinTree* tree,void visit(BinTree*)){
if(!tree)
return;
inOrder(tree->left,visit);
visit(tree);
inOrder(tree->right,visit);
}
int main(){
int in[] = {5,6,7,8,9,10,11};
int post[] = {5,7,6,9,11,10,8};
BinTree* tree;
bool success = buildTree(tree,in,in+6,post,post+6);
if(success)
inOrder(tree,&print);
else
cout<<"fail";
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息