判断排序二叉树的后序遍历是否正确(对递归算的总结)

#include <iostream>
using namespace std;
//排序二叉树的性质
/*
  *.终止条件:1.开始>=结尾返回真
  *. 		  2.s >= e 因为不出现问题的话,一定能到达 s>=e的情况。知道到达了s >= e即为真
  *.
  1.最后一个节点是root
  2.在root之前的节点 连续的大于root的是其右子树, 再之前连续小于root的是其左子树
  3.递归调用
  */
bool treehelper(int a[], int s, int e)
{
	if(a == NULL)return 0;
	if(s >= e)return 1; 	//在没有右子树的情况下,可能会出现s >= e
	int i = e-1;
	while( i >= s && a[e] <= a[i] )i--;
	if(!treehelper(a,i+1,e-1))
	{
		return 0;
	}
	int k = i;
	while( i >= s && a[e] > a[i])i--;
	if( s < i+1 )return 0;		//如果左子树判断完还有大于root的值,直接说明这不是一颗排序二叉树的后序
	return treehelper(a,s, k);
}
int PostorderResult(int a[], int n)
{
	return treehelper(a,0,n-1);
}

int main()
{
	int a[] = {1,5,7,6,9,11,10,8};
	int i = PostorderResult(a,sizeof(a)/sizeof(a[0]));
	cout <<	i << std::endl;
	return 0;
}
//至于前序的更简单 遍历一下就行了。中序的话
bool treehelper2(int a[], int s, int e)
{
	if( a == NULL)return NULL;
	if( s >= e)return 1;

	int i = s+1;
	while( i <= e && a[s] > a[i])i++;
	if(!treehelper2(a,s+1,i-1))
	{
		return 0;
	}
	int k = i;
	while( i <= e && a[s] <= a[i])i++;
	if( e > i-1 )return 0;
	return treehelper2(a,k,e);
}

这里的递归是很经典的,我自己总结一下,不过总结的不咋点。。。

1.子问题

2.终止条件(包括一些边界)

子问题:每个后序判断都是划分成其左子树的后序一右子树的后序,然后左右子树可以递归下去。这就找到了子问题。

终止条件:当s>=e时,会出现s>=e只有不出问题的递归到每个子节点才有可能发生,当递归到这了,这个后序代表着是没有问题的。

总结的一般形式:

void func(int a, int b)//这里的参数都是控制子问题规模的参数

{

if(...)return ;
//递归的终止条件

//下面是对当前这个问题进行解决,一般都会涉及到子问题

int i =  func(a+x,b-x); //这个是对子问题的划分,也是控制子问题

int j =  func(a-x,a+x); //

return i*j;
//最后根据子问题返回的值,返回这整个问题的结果。

}

自娱自乐,轻喷!!

时间: 2024-08-02 11:26:31

判断排序二叉树的后序遍历是否正确(对递归算的总结)的相关文章

判断序列是否是二叉树的后序遍历序列

这个题的意思就是给定一个序列,判断这个序列是否是某个二叉排序树的后序遍历序列,这个算法的方法主要是根据后序遍历的性质,首先这个序列的最后一个元素肯定是根元素,然后将序列从左往右遍历,找到第一个大于根元素的点,这个点左边的肯定是当前根的左子树,这个点的右边肯定是当前根的右子树,继续向后遍历,看右子树中是否有值小于根,如果有,则false,否则分左右子树分别再次调用函数进行判断.具体代码如下: 1 public class IsLastOrder{ 2 3 public boolean islast

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

Binary Tree Postorder Traversal 二叉树的后序遍历

地址:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题意就是完成二叉树的后序遍历,我们知道如果使用递归进行二叉树后序遍历将是非常简单的事情. public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer > ans = new ArrayList<>(); Tr

leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 说明: 1) 两种实现,递归与非递归 , 其中非递归有两种方法 2)复杂度分析:时

[LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 经典题目,求二叉树的后序遍历的非递归方法,跟前序,中序,层序一样都需要用到栈,后续的顺序

树结构练习——排序二叉树的中序遍历

树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

二叉树 根据后序遍历生成二叉树

题目:给定一个二叉树的后序遍历数组arr[],生成二叉树 解题思路:根据搜索二叉树的性质,数组的最后一位arr[end]是二叉树的根,而且数组的左部分比arr[end]小,是根节点的左子数,数字的右部分比arr[end]大,是数组的右子数. Example: 树的形状如上图,后序遍历为:1 3 2 6  8 7 5 arr[end] = 5; 左部分(左子树):{1,3,2} 右部分(右子树):{6,8,7} package cn.edu.algorithm.prototype; /** * 根

树结构练习——排序二叉树的中序遍历(二叉搜索树)

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序 遍历的结果. 输入 输入包含多组数据,每组数据格式如下.