二叉树表示如下:
二叉树前序序列化表示如下:
1 2 4 8 -1 -1 9 -1 -1 5 10 -1 -1 11 -1 -1 3 6 -1 12 -1 -1 7 -1 -1
-1代表左右孩子为NULL的情况,使用前序序列构建二叉树(递归或非递归)。
二叉树结构表示如下:
struct TreeNode{
TreeNode(int value):left(NULL),right(NULL),val(value){ }
TreeNode *left;
TreeNode *right;
int val;
};
最后一层查找过程:
采用BFS,记录每个结点的层数,当出现当前层数大于前一层数的情况时,表明是新的一层出现,这时候记录新一层的结点。
vector<int> FindLastLayer(TreeNode *root){
if(NULL == root) return vector<int>();
typedef std::pair<TreeNode*,int> PTI;
queue<PTI> q;
q.push(PTI(root,1));
int prevdeepth = -1;
vector<int> result;
PTI curnode ; //记录当前访问结点
while(!q.empty()){
curnode = q.front();
q.pop();
if(curnode.second > prevdeepth){ //表明新的一层的第一个结点出现了
result.clear(); //清除上一层的记录
prevdeepth = curnode.second;
}
result.push_back(curnode.first->val); //每个当前结点的层数只可能大于等于前一结点的层数
if(curnode.first->left != NULL)
q.push(PTI(curnode.first->left, curnode.second + 1)); //左孩子层数加一
if(curnode.first->right != NULL)
q.push(PTI(curnode.first->right, curnode.second + 1)); //右孩子层数加一
}
return result;
}
调用主接口:
int main(void)
{
TreeNode *root = NULL;
PreoderBuildTree(root);
vector<int> result = FindLastLayer(root);
vector<int>::iterator begin = result.begin(), end = result.end();
for(; begin != end; ++begin){
std::cout << *begin << " ";
}
std::cout << std::endl;
}