自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猛龙过蒋的专栏

算法学习

  • 博客(36)
  • 收藏
  • 关注

原创 创建二叉排序树

创建二叉排序树(1)创建二叉排序树,二叉树排序树有个特点,          如果结点值大于根,则在右子树去查找插入位置,          如果小于树根,在左子树去查找树根,          如果相等,不作任何操作(2)根据上面的特性,需要两个结点,分别是当前结点和父节点(3)先遍历二叉树节点,找到要插入的位置,根据父节点的指向要插入的位置实现过程如下所示:pa

2016-09-28 16:08:04 978

原创 将二叉查找树变为有序的双向链表

递归实现将二叉查找树变为有序的双向链表,要求不能创建新节点,只调整指针(1)如果一个节点是空树或者节点不存在左子树和右子树,则返回该节点(2)定义临时变量,用来接收递归出口得到的结果(3)如果返回的是左子树的左节点,中序遍历找到临时节点的最右边的节点,然后让临时变量的节点的右孩子指向树根,树根的左孩子指向临时节点(4)如果返回的是右子树的右节点,中序遍历找到临时节点的最左边的节点,

2016-09-17 20:23:29 576

原创 判断两个树是否互相镜像

判断两个树是否互相镜像(1)如果这两棵树是空树,则返回true(2)如果一棵空树,另一颗不是空树,则返回false(3)否则递归第一棵树的左子树和第二颗树的右子树和递归第一棵树的右子树和第二颗树的左子树package cn.edu.nwu.tree;/** * @author jcm * *时间 2016年9月16日 */public class GetT

2016-09-16 17:24:51 1342

原创 求二叉树镜像(破坏二叉树和不破坏二叉树使用非递归实现求解二叉树镜像)

求二叉树镜像(破坏二叉树和不破坏二叉树使用非递归实现求解二叉树镜像)实现过程如下所示:package cn.edu.nwu.tree;import java.util.Stack;/** * @author jcm * *时间 2016年9月16日 */public class GetTreeNodeMirror { public static void main(St

2016-09-16 16:44:34 383

原创 求二叉树的镜像(破坏二叉树和不破坏二叉树用递归实现求二叉树镜像)

求二叉树的镜像,破坏原来的二叉树(1)如果二叉树为空,返回空(2)如果二叉树不为空,求左子树和右子树的镜像(3)交换左子树和右子树 (4)原来的树根直接指向交换后的左子树和右子树求二叉树的镜像,不能破坏原来的二叉树实质跟上面一样,只是申请一个树根节点,最后指向交换后的左子树和右子树实现过程如下所示:package cn.edu.nwu.tree;

2016-09-16 16:19:25 416

原创 判断二叉树是不是平衡二叉树

判断二叉树是不是平衡二叉树 ,使用递归解法。平衡二叉树有个特点,就是左右子树之差绝对值不能大于1,所以需要借助二叉树深度,之前求出过二叉树深度(1)如果二叉树为空,返回真(2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,否则返回假package cn.edu.nwu.tree;/** * @author jcm *

2016-09-16 15:38:05 463

原创 判断两棵二叉树是否相同的树

判断两棵二叉树是否相同的树,递归实现方式是,需要知道递归的出口,(1)如果两棵二叉树都为空,返回真(2)如果两棵二叉树一棵为空,另一棵不为空,返回假(3)否则递归左子树和右子树如果是非递归实现判断两颗二叉树是否相同,可以按层次遍历,需要借助两个队列(1)在while循环内,如果两个当前节点都是空值,跳出本次循环继续下一次循环(2)如果两个当前节点都不为空,并且他

2016-09-16 13:26:46 3851

原创 求解二叉树第K层节点数目

求解二叉树第K层节点数目,使用递归解法,第k层的节点数=第k-1层左孩子节点数+第k-1层右孩子节点数目,直到k==1时,说明已经到了第K层。非递归实现二叉树的第K层节点数目,需要借助队列,与求解二叉树深度相似,只是在while循环条件多加了判断k>1,如果k>1,说明已经遍历在k-1层,这样刚好在遍历的过程中已经求解出下一层的节点个数即第k层实现过程如下所示:package cn.e

2016-09-16 11:28:25 8122

原创 输出二叉树叶子节点数目

输出二叉树叶子节点数目,用递归实现方式,如果二叉树是一个空树,则输出0,如果二叉树存在,则如果存在节点的左孩子和右孩子节点都是空,则返回1,否则递归左孩子和右孩子。非递归实现统计二叉树叶子节点数目,按层次遍历,需要借助队列来实现先定义一个变量,用来计数叶子节点根节点入队,在while循环的时候,先出队,然后用当前节点指向出队队头节点如果存在左孩子节点,则左孩子入队如果存在右孩子

2016-09-15 22:34:16 2693

原创 层次遍历二叉树从上到下左往右遍历

层次遍历二叉树从上到下左往右遍历,需要借助队列来实现先初始化队列,将根节点压入队列当队列不为空,先出队,让当前节点指向出队的节点输出当前节点如果存在左孩子节点,左孩子入队如果存在右孩子节点,右孩子入队实现过程如下所示:package cn.edu.nwu.tree;import java.util.LinkedList;import java.

2016-09-15 22:08:15 4066

原创 后续遍历二叉树

后续遍历二叉树,递归实现二叉树后续遍历,先递归左孩子节点,然后递归右孩子节点,最后输出节点值。非递归实现二叉树后续遍历,需要借助两个栈。非递归实现二叉树后续遍历,需要借助两个栈来实现第一个栈按前序遍历将二叉树节点压栈第二个栈是当第一个栈要出栈的时候,将当前出栈的节点压栈到第二个栈如果当前节点存在左孩子节点,则压栈到第一个栈如果当前节点存在右孩子节点,则压栈到第一个栈 最后当

2016-09-15 21:32:00 1174

原创 中序遍历二叉树

中序遍历二叉树,递归实现中序遍历二叉树,先左孩子进栈,然后输出当前节点,最后右孩子进栈。非递归实现中序遍历二叉树,需要借助栈来实现。如果二叉树不为空,将二叉树的根节点压栈栈有个特点是先进后出,所以要先让左孩子一直进栈如果当前节点为空,则栈顶出栈,赋值给当前节点输出刚出栈的栈顶元素让当前节点的右孩子节点指向当前节点,接着下次循环,一直让左孩子进栈实现过程如下所示:

2016-09-15 20:46:08 374

原创 先序遍历二叉树

先序遍历二叉树,递归方式解决先序遍历二叉树,如果二叉树不为空,先输出二叉树节点,然后递归左孩子右孩子。非递归实现二叉树前序遍历,需要借助栈来实现如果二叉树不为空,将二叉树的根节点压栈栈有个特点是先进后出,所以要先让右孩子进栈,然后左孩子进栈在while循环的时候,先出栈,然后输出节点,如果当前节点存在右孩子,先把右孩子压栈如果当前节点存在左孩子,把左孩子压栈

2016-09-15 19:46:13 392

原创 二叉树的深度

二叉树的深度,递归实现,如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1,非递归实现,需要队列和两个变量分别是当前层节点数和下一层节点数,如果当前层节点数=0,说明已经访问完了,需要便利下一层,所以需要自增。实现过程如下所:package cn.edu.nwu.tree;import java.util.LinkedList;import java.ut

2016-09-15 18:47:01 226

原创 求二叉树节点

求二叉树节点,可以用递归方式实现,二叉树节点个数=左子树节点个数+右子树节点个数+1。非递归实现,需要借助队列来实现,按层次节点分别入队,并且每一次入队节点数自增。实现过程如下所示:package cn.edu.nwu.tree;import java.util.LinkedList;import java.util.Queue;/** * @author jcm * *时间 20

2016-09-15 16:48:20 394

原创 二叉树节点的定义和构造二叉树

定义二叉树节点,需要左右节点,和存放元素值。实现过程如下所示:package cn.edu.nwu.tree;/** * @author jcm * *时间 2016年9月15日 */public class TreeNode { int data; TreeNode leftChild; TreeNode rightRight; TreeNode(int data){

2016-09-15 16:42:25 3694

原创 堆排序

堆排序实现过程如下所示:/** * @author jcm * *时间 2016年9月11日 */public class HeapSort { public static void main(String[] args) { int[] array = {13,12,11,10,9,8,89,-1,76,0,332,13,19,32,35,56,75,97,98,112}

2016-09-11 13:24:32 201

原创 希尔排序

希尔排序最基本还是是插入排序,只不过在插入排序的基础上,一次交换好多逆序,而插入排序一次只能交换一次逆序,所以希尔排序比起插入排序要快。其次计算间隔,是有个公式,即 h=3*h-1来计算间隔,间隔初始值是1,直到间隔的初始值大于数组的大小时停止,最大间隔不大于数组大小的最大值。实现过程如下所示:/** * @author jcm * *时间 2016年9月11日 */public

2016-09-11 10:53:53 349

原创 快速排序

快速排序,传进三个参数,分别是数组,左边和右边的大小。先判断左边是否小于右边,因为要递归,这作为递归的出口条件。然后在定义三个变量,分别是low,high和比较的关键字。完成一趟排序的时候,将关键字和当前high所指的这个元素进行交换。实现过程如下所示:/** * @author jcm * * 2016年8月6日 */public class QuickSort {

2016-09-11 09:44:05 223

原创 简单选择排序

简单选择排序,要选取一个关键字下标,与关键字作比较,如果小于关键字,则交换下标。实现过程如下所示:/** * @author jcm * *时间 2016年8月6日 */public class SelectSort { public static void main(String[] args) { int array[] = { 23, 18, 19, 17, 45, 8

2016-09-10 15:06:08 182

原创 插入排序

插入排序,要备份要插入的元素,然后从后向前比较,如果前面值大于要插入的元素,则前面值向后移动一位,最后找到要插入的位置。实现过程如下所示:/** * @author jcm * * 2016年8月6日 */public class InsertSearch { public static void main(String[] args) { int array[] = {1

2016-09-10 10:44:20 208

原创 冒泡排序

冒泡排序,需要进行n-1趟排序,内部循环是两个相邻元素进行比较,假如是升序排序,那么比较的时候,使得最大值元素向右移。实现过程如下所示:/** * 冒泡排序 * @author jcm * 2016年8月6日 */public class BubbleSort { public static void main(String[] args) { int array[] =

2016-09-10 09:50:13 225

原创 二分查找折半查找排序

在一个有序的数组中,折半查找一个元素key,如果能找到返回数组的下表,如果找不到,返回-1。实现如下所示:/** * 二分查找法 * @author jcm * 2016年8月6日 */public class BinarySerach { public static void main(String[] args) { int a[] = {13,19,32,35,56

2016-09-10 09:34:25 1578

原创 是否完全二叉树

是否完全二叉树,实现过程如下所示:package cn.edu.nwu.structs.tree;import java.util.LinkedList;import java.util.Queue;/** * @author jcm * *时间 2016年9月3日 */public class IsCompeteBinaryTree { public static vo

2016-09-03 22:37:20 217

原创 递归和非递归实现二叉树的后续遍历

非递归实现二叉树的后续遍历,思想是先定义一个带有标记和二叉树节点的类,把类压栈,并且要设置标记,赋值为true,然后出栈,并且改变标记true为false,最后遍历右子树,直到第二次开始出栈,标记是false,直接访问节点。递归和非递归实现过程如下所示:package cn.edu.nwu.structs.tree;import java.util.Stack;/** * @aut

2016-09-03 21:24:42 1297

原创 递归和非递归显示前序遍历

非递归实现前序遍历,和中序遍历查不多,只是输出条件改变下,实现过程如下所示:package cn.edu.nwu.structs.tree;import java.util.Stack;/** * @author jcm * 前序遍历二叉树 * 时间 2016年9月3日 */public class PreOrderBinaryTree { public static voi

2016-09-03 13:04:59 241

原创 递归实现和非递归实现中序遍历二叉树

非递归实现中序遍历二叉树,需要借助栈来实现,首先定义一个当前的树节点,先让二叉树的左子树进栈,并且当前节点指向二叉树的左子树,当当前节点为null的时候,出栈,先让栈指针指向当前节点,并且打印当前节点,然后右子树进栈,接着左子树进栈,一直这样的操作,直到不满足循环条件,跳出循环。实现过程如下所示:package cn.edu.nwu.structs.tree;import java.util

2016-09-03 12:34:37 486

原创 求二叉树的深度

求二叉树的深度,实现过程如下所示:package cn.edu.nwu.structs.tree;/** * @author jcm * *时间 2016年9月3日 */public class GetBinaryTreeDepth { public static void main(String[] args) { BinaryTreeNode root = CreateB

2016-09-03 11:16:57 191

原创 求二叉树的叶子节点数目

求二叉树的叶子节点数目,实现过程如下所示:package cn.edu.nwu.structs.tree;/** * @author jcm * *时间 2016年9月3日 */public class GetLeafCount { public static void main(String[] args) { BinaryTreeNode root = CreateBin

2016-09-03 11:03:42 481

原创 在一颗二叉排序树上删除节点

二叉排序树上,删除二叉树节点,有三种情况需要考虑1、如果删除的是叶子节点(需要考虑两种情况,左节点和右节点)如果是左节点,则把父节点的左节点设为null,同理是父节点右节点设为null2、如果删除的节点只有一个子节点,那么需要考虑子节点是在左边还是右边      如果子节点是在左边,还要考虑被删除的节点是在左边还是右边,如果是左边,则父节点左孩子节点直接指向子节点,否则是父节点

2016-09-02 22:39:00 631

原创 在一颗二叉树上插入节点

在一颗二叉树上插入节点,插入是建立在小于父节点,则插入到父节点左边,如果大于父节点,则插入到父节点右边。在插入树节点,需要判断树根是否为空,如果不为空,则需要当前节点指向树根和父节点指向当前节点。直到当前节点等于null,那么可以在父节点左边或者右边插入新节点,并且返回树根跳出循环。如果树根为空,直接把树根指向新创建的节点,实现过程如下所示:package cn.edu.nwu.structs

2016-09-02 17:29:11 5666

原创 寻找左兄弟节点

寻找左兄弟节点,与寻找父节点一样,在判断右兄弟节点是否等于某个值,如果等于,直接返回左兄弟节点,实现过程如下所示:package cn.edu.nwu.structs.tree;/** * @author jcm * 找父节点 * 时间 2016年9月1日 */public class GetLeftBrotherTreeNode { public static int left

2016-09-02 15:43:38 1053

原创 寻找父节点

寻找父节点,实现过程如下所示:package cn.edu.nwu.structs.tree;/** * @author jcm * 找父节点 * 时间 2016年9月1日 */public class GetFatherTreeNode { public static int father = -1; public static void main(String[] args

2016-09-01 22:31:26 514

原创 求叶子节点到根结点路径和为14,并且打印路径

求叶子节点到根结点路径和为14,并且打印路径,实现过程如下所示:package cn.edu.nwu.structs.tree;/** * @author jcm * 求根节点到叶子节点路径和为14,这是百度面试题 * 时间 2016年9月1日 */public class PrintTreeNodePath { //定义栈 public static BinaryTreeN

2016-09-01 21:44:15 624

原创 二叉搜索树转换为双向链表

二叉搜索树转换为双向链表,实现过程如下所示:package cn.edu.nwu.structs.tree;/** * @author jcm * 将一颗平衡二叉树转化为双链表 * 时间 2016年9月1日 */public class BinaryTreeToLinkList { public static void main(String[] args) { Binar

2016-09-01 14:36:33 270

原创 字符串反转

字符串反转,输入一个字符串,输出的是字符串的逆序,也就是反转,方法一是用字符串分割函数split,方法二是使用charAt方法。实现过程分别如下所示:package structs.string;/** * @author jcm * *时间 2016年9月01日 */public class StringReverse { public static void main(St

2016-09-01 08:27:01 237

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除