【刷题】剑指offer 21~30

JZ21 栈的压入、弹出序列(好好想想)

题目

在这里插入图片描述

代码

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty() || popV.empty() || pushV.size()!=popV.size()){
            return false;
        }
        /*  使用一个栈遍历入栈序列
         *  然后在出栈序列中寻找当前的序号  如果找到  则出栈
            弹出栈的元素  一定先入栈
         */

        stack<int> s;
        int i=0, j=0;
        while(i<pushV.size()){ // 遍历入栈序列
            s.push(pushV[i]);  // 进栈
            i++;
            while (!s.empty() && s.top()==popV[j]){ // 比较s和popV
                // 如果在出栈序列中找到
                s.pop(); // 弹出
                j++;
            }
        }

        // 遍历完入栈序列后 如果s中还有元素 说明不匹配
        return s.empty();
    }
};

JZ22 从上往下打印二叉树

题目

在这里插入图片描述

知识

这道题需要使用队列来解决
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
先进先出

代码

// 总的来说
// 就是通过队列的性质  将二叉树按照从上到下、从左到右的节点
// 放入队列中
/*
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> result;
        if(!root) return result;
        
        // 利用队列先进先出的性质  将root push进队列中
        
        queue<TreeNode*> q;
        q.push(root);  // 将根节点放进去
        while(!q.empty()){
            TreeNode* node = q.front();  // 取队列头  即二叉树中先放入的数据
            q.pop();  // quchu1
            result.push_back(node->val);
            
            // 一层一层地放   先进先出
            if(node->left) q.push(node->left);
            if(node->right) q.push(node->right);
        }
        
        return result;

    }
    
    
};

JZ23 二叉搜索树的后序遍历序列

题目

在这里插入图片描述

知识

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值