每次都对队列使用栈进行反转,反转之后节点的存入顺序都要发生改变,如果从左到右进行遍历就得先存左孩子再存右孩子,如果从右到左进行遍历就得先存右孩子再存左孩子 。
剑指 Offer 33. 二叉搜索树的后序遍历序列
//方法一:class Solution {public:bool verifyPostorder(vector
方法一:单调栈的使用,题目说要判断一个数组是不是后续遍历(left->righe->root)的结果,那我们不妨将其数组颠倒过来,那是不是就是(root->right->left)这不就成了从right开始的先序遍历,那我们只要掌握了先序遍历的规则,岂不是迎刃而解,这里使用到了单调栈,因为我们是从right开始的,根据二叉搜索树的概念,那么right>root,根据这个特性,我们使用单调递增的栈,如果栈非空并且访问的该元素大于栈顶元素那么就表示还是访问right,我们直接压入就行,不需要其他操作,但是若一个元素小于栈顶元素,那么就表示某一个root的right访问完了,现在该访问这个root的left了,那么现在的问题就转变成了怎么记录下这个root的值,以便做题,那我们能想到,二叉搜索树right都是大于root值的,并且我们刚才已经将right的值都已经存入单调栈了,那么我们只需要一只弹出刚才栈顶的元素,并记录下来,知道栈顶元素小于该值就说明上一个弹出的栈顶元素就是现在数组所指向位置索引的root了,这样问题就解决了,那么到底怎么他才不是一个二叉搜索的后序遍历呢,其实很简单,二叉搜索树的root>left,right>root我们刚才又知道了root的值,那么我们直接比较就行了,如果数组访问的元素大于之前记录的root值即left>root了,那么就不是了 。
方法二:
剑指 Offer 34. 二叉树中和为某一值的路径
/*** Definition for a binary tree node.* struct TreeNode {*int val;*TreeNode *left;*TreeNode *right;*TreeNode() : val(0), left(nullptr), right(nullptr) {}*TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {public:vector
- 《窥情》未删减版在哪儿在线观看
- android应用程序开发!在字节跳动我是如何当面试官的,威力加强版
- 初一上册数学 初一上册数学书电子版
- 最值得普通人学的编程语言是哪个?
- win10企业版ltsc密钥 win10企业版ltsc有录屏功能吗
- 造梦西游4好号和密码真的90级 造梦西游4好号和密码真的手机版
- iqooneo7竞速版屏幕尺寸
- 一九四二电影免费完整版在哪儿在线观看
- 偷窥课程完整版是什么电影
- 医用口罩和普通口罩有什么区别