关于二叉树后序遍历和递归
一些基础递归题目来源牛客网→剑指offer
跳台阶:一只青蛙可以一次性跳1个台阶也可以一次性跳两个问青蛙一次性跳n个台阶有几种跳法。
解题思路:
首先如果我们按照正常的思路想一只青蛙跳一个台阶的跳法肯定只有1种,跳两个台阶的方法肯定只有2种,拿我们跳三个台阶的方法我们是否可以想成先跳一个台阶在跳剩余两个台阶和先跳了两个台阶在跳剩余一个台阶这两种方式,所以依次类推,我们就可以求出n个台阶的跳法,具体用代码我们就可以运用递归循环调用,这里我运用C++进行实现。
class Solution {
public:
int jumpFloor(int number) {
if(number == 0)return 0;
if(number == 1)return 1;
if(number == 2)return 2;
return jumpFloor(number-1)+jumpFloor(number-2);
}
};
//首先递归也可以理解为一种函数循环调用的一种循环所以肯定要有结束的标志,所以这里我们要进行对于特殊值的标定
if(number == 0)return 0;
if(number == 1)return 1;
if(number == 2)return 2;
n = 4 的流程图
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
解题思路,首先我们知道后序遍历是根据左右根的顺序遍历的,而且不难发现这个遍历的数组的中的规律是最后一位是根结点,前半段是根结点的左,前半段的后面是根结点的右部分,因为我们可以根据这个规律来实现这个函数。且因为是根据有序二叉树的法则根结点的左侧小于根结点,根结点的右侧大于等于根结点,因为这里已经假设不存在相等的数字,因此更有利于判断。
class Solution {
public:
bool is_post(vector<int> sequence,int begin,int end)
{
if(begin >= end)return true;
int i = begin;
for(;i<end;i++)
{
if(sequence[end]<sequence[i])
break;
}
for(int j = i ;j<end;j++)
{
if(sequence[j]< sequence[end])
return false;
}
bool fl = is_post(sequence,begin,i-1);
bool fr = is_post(sequence,i,end-1);
return fl && fr;
}
bool VerifySquenceOfBST(vector<int> sequence) {
int len = sequence.size();
if(sequence.size()== 0)
return false;
return is_post(sequence,0,len-1);
}
};
if(sequence.size() == 0)
首先判断是否为空如果为空则返回false
子函数is_post
需要传入 数组 数组的首地址 尾地址
首先递归循环的跳出标志当 begin > = end 时候我们返回上层函数i,然后我们需要知道那个分界左右部分的值,再循环调用在其左右部分就可以实现该功能,非常重要的一点是在求出这个值时,我们要判断后面的部分是否满足有序二叉树的法则因此要加一个循环