1.栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:建立一个栈,一次按压入顺序压栈,每压入一个元素的时候判断与弹出序列元素是否相等,若相等,则弹出,若不等,继续压栈,都压完后看这个栈是否是空的。

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size()==0||popV.size()==0) return false;
        stack<int> s1;
        int len=pushV.size();
        int i=0,j=0;
        while(i<len)
        {
            s1.push(pushV[i]);
            while(!s1.empty()&&s1.top()==popV[j])
            {
                s1.pop();
                j++;//如果栈顶元素等于弹出序列元素,就依次弹出
            }
            i++;//不等于就继续压栈
        }
        return s1.empty();
    }
};

2.从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路:建立一个队列,首先放入根节点,然后当队列不为空时,再依次放入根节点的左右子节点,依次类推。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
        if(root==nullptr) return res;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            res.push_back(q.front()->val);//将队首存入数组
            TreeNode *p=q.front();//设置一个临时变量
            q.pop();//弹出
            if(p->left)
            {
                q.push(p->left);//压入子节点
            }
            if(p->right)
            {
                q.push(p->right);//压入右节点
            }
        }
        return res;          
    }
};

3.二叉搜索树的后序遍历
输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:二叉搜索树后续遍历,根节点在最后面,前面是左子树(小于根节点的值),后面是右子树(大于根节点的值),对应子树也要符合这种规律。因此我们利用递归的思想。构建两个数组,一个存储根节点的左子树,一个存储根节点的右子树。首先找到根节点,从头遍历数组,小于根节点的放入左子树,出现大于,改为放入右子树,一旦后面的值有小于根节点的,就直接返回false,如果成功遍历完数组,则递归判断左子树数组与右子树数组。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int len=sequence.size();
        if(len==0) return false;
        vector<int> left;
        vector<int> right;
        int root=sequence[len-1];//根节点
        int i=0;
        for(;i<len-1;i++)
        {
            if(sequence[i]>root)
                break;
            left.push_back(sequence[i]);//左子树的节点值都小于根节点
        }
        int j=i;
        for(;j<len-1;j++)
        {
            if(sequence[j]<root)
                return false;//右子树的节点值都大于根节点,因此出现小于根节点的,直接删除
            right.push_back(sequence[j]);
        }
        if(i>0)
            VerifySquenceOfBST(left);//有左子树的话,就递归遍历左子树
        if(i<len-1)
            VerifySquenceOfBST(right);//有右子树的话,就递归遍历右子树
        return true;
    }
};