本题来说http://blog.youkuaiyun.com/v_JULY_v/article/details/6057286 ,中的第九题。
我这里介绍一种比较笨的方法,但是也比较直接。
第9题(树)
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
如何解决这个题,我们将最简单,也是最笨的思路,就是先用这个序列建立一个二元树,然后后续遍历二元树看看两者是否相等。
本文主要是想说一些基本算法的使用:
第一步如何根据一个序列建立一个二元树,先上代码
struct BiTree
{
int data;
BiTree *l;
BiTree *r;
};
void toBiTree(BiTree *b, int num)
{
if(num > b->data )
{
if (b->r == NULL)
{
BiTree *newtree = new BiTree;
newtree->data = num;
newtree->l = NULL;
newtree->r = NULL;
b->r = newtree;
return;
}
else
{
b = b->r;
}
}
else
{
if (b->l == NULL)
{
BiTree *newtree = new BiTree;
newtree->data = num;
newtree->l = NULL;
newtree->r = NULL;
b->l = newtree;
return;
}
else
{
b = b->l;
}
}
toBiTree(b, num);
}
思路是递归的思想,如果此节点的左节点为空,并且插入的元素小于这个节点,那么此元素为此节点的左节点;反之,此节点的右节点为空,并且插入的元素大于这个节点,那么此元素为此节点的右节点。
第二步是后续遍历:
int position = 0;
void lastOrder(BiTree* b, int *p)
{
if (b==NULL)
return;
lastOrder(b->l,p);
lastOrder(b->r,p);
p[position++] = b->data;
}
此时需要用一个辅助的全局变量来记录后续变量的结果。
主函数为:
int main()
{
int a[7] = {5,7,6,9,11,10,8};
BiTree *bt = new BiTree;
bt->data = a[6];
bt->l =NULL;
bt->r = NULL;
for (int i = 5 ;i >=0 ;i--)
{
toBiTree(bt, a[i]);
}
int b[7];
lastOrder(bt , b);
cout<<"last"<<endl;
int i =0;
for (; i<7;i++)
{
if (a[i] != b[i])
{
cout<<"no"<<endl;
break;
}
}
if (i ==7)
cout<<"right"<<endl;
}
以后有时间的话,会补充写一下简单的方法。