解题思路:
这道题第一次没有思路,有了思路之后很简单
就是,后序遍历最后一个元素就是根节点,然后重新遍历整个序列
这个序列,一旦遇到了大于跟结点的数字,那么就不可能再遇到小于根节点的数字了,一旦遇到了,就说明这个序列不是合格的二叉搜索树的后续遍历序列
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty())
return false;
int root = sequence.back();
int size = sequence.size();
int i;
for (i = 0; i < size; ++i)
{
if (sequence[i] > root)
{
break;
}
}
for (i; i < size; ++i)
{
if (sequence[i] < root)
{
return false;
}
}
return true;
}
};
第二题
解题思路:
按照之前的,将二维数组层序遍历,然后将每一层放在一个数组中,最后将一个二维数组传出来的思路是一样的,只需要最后加一步,将后拿到的二维数组,每隔一行进行逆序,就行了。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> vec1;
if (pRoot == nullptr)
return vec1;
queue<TreeNode*> que;
que.push(pRoot);
int count = 1; //用来记录本层,进入队列的个数。刚开始的时候队列中已经有了一个元素
int size = 0; //用来记录下一层元素的个数
while (!que.empty()) //当队列不为空就一直循环
{
vector<int> vec2; //最后要插入二维数组的一维数组
while (count) //当
{
TreeNode* p = que.front();
if (p->left)
{
que.push(p->left);
size++; //每进入一个元素+1,记录的是本层元素个数
}
if (p->right)
{
que.push(p->right);
size++;
}
que.pop();
vec2.push_back(p->val);
count--; //每出一个元素,上一层进入的元素就减减,等到了0,就说明,上一层进入元素都出去了
}
count = size; //让本层个数在下次循环中,变成上一层。数据交换
size = 0;
vec1.push_back(vec2);
}
for (int i = 1; i < vec1.size(); i += 2) //每隔一样进行逆序的代码
{
reverse(vec1[i].begin(), vec1[i].end());
}
return vec1;
}
};
比较重要的就是,双层while循环
外层循环结束条件是,队列为空
内层循环结束条件是,上一次循环进入栈的元素,都遍历完(遍历完就意味着,将他的左右子树已经保存在来队列中,而自己也已经被压入一维数组)