1.包括min函数的栈
定义栈的数据结构,请在该范例中完成一个可以获得栈中所含最小元素的min函数(时候复杂度应为O(1))。
思绪
1.定义两个栈,一个栈用于存储数据,另一个栈用于存储每次数据进栈时栈的最小值.
2.每次数据进栈时,将此数据和最小值栈的栈顶元素比较,将两者比较的较小值再次存入最小值栈.
4.数据栈出栈,最小值栈也出栈。
3.如许最小值栈的栈顶永远是当前栈的最小值。
代码
var dataStack = [];
var minStack = [];
function push(node)
{
dataStack.push(node);
if(minStack.length === 0 || node < min()){
minStack.push(node);
}else{
minStack.push(min());
}
}
function pop()
{
minStack.pop();
return dataStack.pop();
}
function top()
{
var length = dataStack.length;
return length>0&&dataStack[length-1]
}
function min()
{
var length = minStack.length;
return length>0&&minStack[length-1]
}
2.栈的压入、弹出序列
输入两个整数序列,第一个序列示意栈的压入递次,请推断第二个序列是不是可能为该栈的弹出递次。假定压入栈的一切数字均不相称。比方序列1,2,3,4,5是某栈的压入递次,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不多是该压栈序列的弹出序列。(注重:这两个序列的长度是相称的)
思绪
1.借助一个辅佐栈来存储数据。
2.将pushV中的数据顺次入栈。
3.出栈有可能在恣意一次入栈后举行,当出栈数据不再位于栈顶,继承入栈。
4.所以设置一个索引,纪录当前出栈的位置,每次出栈索引+1。
5.当一切数据入栈完成,假如出栈递次准确,那末辅佐栈应该为空。
代码
function IsPopOrder(pushV, popV) {
if (!pushV || !popV || pushV.length == 0 || popV.length == 0) {
return;
}
var stack = [];
var idx = 0;
for (var i = 0; i < pushV.length; i++) {
stack.push(pushV[i]);
while (stack.length && stack[stack.length - 1] == popV[idx]) {
stack.pop();
idx++;
}
}
return stack.length == 0;
}
3.题二叉树的后续遍历
输入一个整数数组,推断该数组是不是是某二叉搜刮树的后序遍历的效果。假如是则输出Yes,不然输出No。假定输入的数组的恣意两个数字都互不雷同。
思绪
1.后序遍历:分红三部份:末了一个节点为跟节点,第二部份为左子树的值比跟节点都小,第三部份为右子树的值比跟节点都大。
2.先检测左子树,左边比跟节点小的值都判定为左子树。
3.除末了一个节点外和左子树外的其他值为右子树,右子树有一个比跟节点小,则返回false。
4.若存在,左、右子树,递归检测左、右子树是不是复合范例。
代码
function VerifySquenceOfBST(sequence) {
if (sequence && sequence.length > 0) {
var root = sequence[sequence.length - 1]
for (var i = 0; i < sequence.length - 1; i++) {
if (sequence[i] > root) {
break;
}
}
for (let j = i; j < sequence.length - 1; j++) {
if (sequence[j] < root) {
return false;
}
}
var left = true;
if (i > 0) {
left = VerifySquenceOfBST(sequence.slice(0, i));
}
var right = true;
if (i < sequence.length - 1) {
right = VerifySquenceOfBST(sequence.slice(i, sequence.length - 1));
}
return left && right;
}
}
4.二叉树中和为某一值的途径
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的一切途径。途径定义为从树的根结点最先往下一直到恭弘=叶 恭弘结点所经由的结点构成一条途径。(注重: 在返回值的list中,数组长度大的数组靠前)
思绪
1.运用前序遍历
2.运用一个辅佐栈来存储当前途径里的数据
3.纪录一个当前途径的和
4.遍历到当前节点后,当前值入途径栈,和加当前值
5.递归左孩子右孩子节点
6.遍历完一个节点,退回到上一个节点,从途径栈中移除当前的值,和减当前值
代码
function FindPath(root, expectNumber) {
var result = [];
if (!root) {
return result;
}
findPath(root, expectNumber, [], 0, result);
return result;
}
function findPath(node, expectNumber, vector, sum, result) {
vector.push(node.val);
sum += node.val;
var isLeaf = !node.left && !node.right;
if (isLeaf && sum === expectNumber) {
result.push(vector.slice(0));
}
if (node.left) {
findPath(node.left, expectNumber, vector, sum, result);
}
if (node.right) {
findPath(node.right, expectNumber, vector, sum, result);
}
vector.pop();
}