这里沿用传统二叉查找树(BST)的概念:所有左子树都小于根,右子树都大于根。(不止是直接孩子,还有间接孩子!)
现在给出一个整数序列,要求判断它是否是一棵二叉查找树BST的后序遍历结果。
如果去掉BST这个条件,我们一般是不能只根据后序遍历结果来确定某一棵树的。
有了BST这个条件后,我们可以这么做:
定义如下递归函数头:
int judge(int* arr, int start, int end)
(1)另root = end-1,则arr[root]为从star[......]
这里沿用传统二叉查找树(BST)的概念:所有左子树都小于根,右子树都大于根。(不止是直接孩子,还有间接孩子!)
现在给出一个整数序列,要求判断它是否是一棵二叉查找树BST的后序遍历结果。
如果去掉BST这个条件,我们一般是不能只根据后序遍历结果来确定某一棵树的。
有了BST这个条件后,我们可以这么做:
定义如下递归函数头:
int judge(int* arr, int start, int end)
(1)另root = end-1,则arr[root]为从star[......]
链表定义如下:
struct Node
{
struct Node* next;
int data;
};
非递归反置链表如下:
struct Node* ll_reverse(struct Node* head)
{
if(head==NULL)
{
return NULL;
}
else
{
struct Node* pre = NULL;
struct Node* next = NULL;
struct Node* ptr =[......]
有许多问题,可以利用试探和回溯的搜索技术求解。
求解的过程实际是先序遍历一棵“状态树”的过程。
例1:有集合A = {1, 2, ...n},求A的全部子集。
思路:从求全部子集(幂集)这个事情上,实际上对每个元素只有两个状态:要么在一个子集中,要么不在。
因此,可以逐一对A中每个元素进行“取”和“舍”,从而构造一棵完全二叉树。
算法如下:
注意这里是1~n,不是0~n
void mj(int n, int pos, int* flag)
{
i[......]
给定一个数组和一个k,输出最小的k个数字。
这个问题有多重解法,譬如:
1、sort, top K,时间复杂度O(nlogn)
2、小顶堆排序,pop+调整k次,时间复杂度O(n+klogn)。
3、选择排序,每次选min,swap到头部时间复杂度O(nk)。
这里写下选择排序这个。
#include <stdio.h>
void select_min(int* arr, int n, int k)
{
int i, j, tmp;
int min[......]