/* 非递归栈实现快排 */ #include <stdio.h> #include <math.h>> #include <malloc.h> #include <windows.h> typedef struct _Stack { int *data; int top; }Stack; /* 一次快排的结果,返回基准的位置 */ int OneQuickSort(int *arr, int i, int j) { //②if(j - i <…
例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tree Postorder Traversal 递归栈 递归函数栈的方法很基础,写法也很简单,三种遍历方式之间只需要改变一行代码的位置即可 中序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre…
看了左神的堆排序,觉得思路很清晰,比常见的递归的堆排序要更容易理解,所以自己整理了一下笔记,带大家一步步实现堆排序算法 首先介绍什么是大根堆:每一个子树的最大值都是子树的头结点,即根结点是所有结点的最大值 堆排序是基于数组和二叉树思想实现的(二叉树是脑补结构,实际是数组) 堆排序过程 1.数组建成大根堆,首先,遍历所有结点,当前结点index和父结点(index-1)/ 2 比较 (当前数组的下标是index,此结点的父结点的下标就是(index-1)/ 2  ),如果比父结点大,交换,变成父结…
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java…
二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历.中序遍历.后续遍历) 递归的思想也就是栈的思想,既然不用递归,那就改用栈的方式. “递归=栈” 1.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问. a)递归实现前序遍历: void PreOrderTraverse(BiTNode *T) /*递归前序遍历*/ { if (T==…
/*汉诺塔非递归实现--利用栈 * 1.创建一个栈,栈中每个元素包含的信息:盘子编号,3个塔座的变量 * 2.先进栈,在利用循环判断是否栈空, * 3.非空情况下,出栈,检查是否只有一个盘子--直接移动,否则就模拟前面递归的情况--非1的情况 * 4.直到栈空就结束循环,就完成全部的移动. * */ class Stack11{ Towers[] tt = new Towers[20]; int top = -1; public boolean isEmpty(){ return top ==…
1.后序遍历的非递归实现.(左右根) 难点:后序遍历的非递归实现是三种遍历方式中最难的一种.因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题.下面介绍两种思路. 思路:有个关键的就是unUsed这个标识符. 当unUsed=1时,表示该节点未遍历过,即以该节点为根节点的左右孩子不曾遍历. 当unUsed=0时,表示该节点的左右孩子都已经被访问过. 由于入栈的顺序和出栈的顺序相反,所以若unUsed=1,则左根右节点依次入栈,且根节…
import java.io.BufferedReader; import java.io.InputStreamReader; //1,3,6,10,15...n 三角数 /* * # 1 * ## 1+2 * ### 1+2+3 * #### 1+2+3+4 * ##### 1+2+3+4+5 * ...第1层为1. 第n层等于 n + (f(n-1)) */ public class TriangleNumber { static int triangle(int n) { if (n <…
1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和pRoot.right是否对称即可 2.左右节点的值相等且对称子树left.left, right.right; left.rigth,right.left也对称 */ 代码: import java.util.*; public class Solution { boolean isSymmetr…
博客地址:http://www.cnblogs.com/yudanqu/ 一.递归 递归调用:一个函数,调用的自身,称为递归调用 递归函数:一个可以调用自身的函数称为递归函数 凡是循环能干的事,递归都能干 方法: 1.写出临界条件 2.找这一次和上一次的关系 3.假设当前函数已经能用,调用自身计算上一次的结果再求出本次的结果 下面我们通过两段代码简单看一下递归和非递归的区别: 输入一个大于等于1的数,求1到n的和! # 普通函数方法 def hanshu(n): sum = 0 # 循环遍历每一…