《剑指Offer》面试题6 重建二叉树——勘误

感觉是个小bug:

// 在中序遍历中找到根结点的值
int* rootInorder = startInorder;
while(rootInorder <= endInorder && *rootInorder != rootValue)
  ++ rootInorder;
if(rootInorder == endInorder && *rootInorder != rootValue)
  throw std::exception("Invalid input.");

 

下面的if判断,其初衷是,如果在中序中没有找到根结点,报错。
例如:输入的前序是:{1, 2, 4, 7, 3, 5, 6, 8}
输入的中序是:{4, 7, 2, 9, 5, 3, 8, 6}
根结点1,在中序中查找,一直查到中序数组的末尾也没找到。按上面的逻辑,是rootInorder一直取到了8。
在if判断中,rootInorder == endInorder,rootInorder 的地址已经越出了数组的界,后面的判断条件不会使用。按理说第一个根结点就找不到,就会直接报异常,终止程序。
但按原文的代码,会继续下面的构建子树。
其实也就一个小bug,改动如下:

//如果在中序序列中没找到前序中对应的根结点
if(rootInorder > endInorder ) throw std::exception("Invalid input.");
posted @ 2015-09-02 22:53  抢地主  阅读(272)  评论(0编辑  收藏  举报