剑指offer-最小数栈,层次遍历,后序遍历序列

最小数栈

描述

定义一个栈,操作有pop,push和min。

思路:

求栈的最小值,仅仅加入一个变量是不够的,因为弹出当前最小值后,还要记录次最小值。所以需要一个辅助栈。当压入的值小于当前最小值时,同时把他压入辅助栈,否则,再把当前的最小值压入辅助栈。

代码:

#include<stack>
using namespace std;
//要加std或者std::stack
struct MyStack
{
	stack<int> s;
	stack<int> min;
};
MyStack Stackpush(MyStack ms ,int v)
{
	ms.s.push(v);
	if (ms.min.size() == 0 || ms.min.top() > v)
		ms.min.push(v);
	else
	{
		ms.min.push(ms.min.top());
	}
	return ms;
}
MyStack Stackpop(MyStack ms)
{
	
	assert(ms.s.size() > 0 && ms.min.size() > 0);
	ms.s.pop();
	ms.min.pop();
	return ms;
}
int StackMin(MyStack ms)
{
	if (ms.min.size() == 0)
		return NULL;
	return ms.min.top();
}

层次遍历

思路:

不同于其他遍历方式,遍历完一个节点后,需要再遍历右方的节点,需要记录上一层的节点,用队列来记录,每次遍历一个节点,将它的儿子节点入队。每次从队列中取出一个节点入队。
PS:广度遍历也是这个思路

代码:

void RankOrder(TreeNode* root)
{
	deque<TreeNode*> q;
	if (root == NULL)
		return;
	else
	{
		q.push_back(root);
	}
	while (q.size() != 0)
	{
		TreeNode* temp = q.front();
		cout << temp->v;
		q.pop_front();
		if (temp->left != NULL)
			q.push_back(temp->left);
		if (temp->right != NULL)
			q.push_back(temp->right);
	}
}

后序遍历序列

描述:

给定一个序列,判断是否是某棵二叉搜索树。

思路:

二叉搜索树的特性是左子树的节点都小于根,右子树的节点都大于根。序列最后的数是根,第一段是左子树,第二段是右子树,当右子树出现小于根的树时,返回false,否则递归地对子序列判断。
代码:

bool BSTpostorder(int arr[], int len)
{
	if (arr == NULL || len <= 0)
		return false;
	int root = arr[len - 1];
	int i = 0;
	for (; i < len - 1; i++)
	{
		if (arr[i] > root)
			break;
	}
	int j = i;
	for (; j < len - 1; j++)
	{
		if (arr[j] < root)
			return false;
	}
	bool left = true;
	if(i>0)//i==0,说明没有当前节点左子树
	left = BSTpostorder(arr, i);
	bool right = true;
	if(i<len-1)//i==len-1,说明没有右子树
	right = BSTpostorder(arr + i, len - 1 - i);
	if (left && right)
		return true;
}
原文地址:https://www.cnblogs.com/void-lambda/p/12361650.html