创建二叉排序树 创建二叉排序树(1)创建二叉排序树,二叉树排序树有个特点, 如果结点值大于根,则在右子树去查找插入位置, 如果小于树根,在左子树去查找树根, 如果相等,不作任何操作(2)根据上面的特性,需要两个结点,分别是当前结点和父节点(3)先遍历二叉树节点,找到要插入的位置,根据父节点的指向要插入的位置实现过程如下所示:pa
将二叉查找树变为有序的双向链表 递归实现将二叉查找树变为有序的双向链表,要求不能创建新节点,只调整指针(1)如果一个节点是空树或者节点不存在左子树和右子树,则返回该节点(2)定义临时变量,用来接收递归出口得到的结果(3)如果返回的是左子树的左节点,中序遍历找到临时节点的最右边的节点,然后让临时变量的节点的右孩子指向树根,树根的左孩子指向临时节点(4)如果返回的是右子树的右节点,中序遍历找到临时节点的最左边的节点,
判断两个树是否互相镜像 判断两个树是否互相镜像(1)如果这两棵树是空树,则返回true(2)如果一棵空树,另一颗不是空树,则返回false(3)否则递归第一棵树的左子树和第二颗树的右子树和递归第一棵树的右子树和第二颗树的左子树package cn.edu.nwu.tree;/** * @author jcm * *时间 2016年9月16日 */public class GetT
求二叉树镜像(破坏二叉树和不破坏二叉树使用非递归实现求解二叉树镜像) 求二叉树镜像(破坏二叉树和不破坏二叉树使用非递归实现求解二叉树镜像)实现过程如下所示:package cn.edu.nwu.tree;import java.util.Stack;/** * @author jcm * *时间 2016年9月16日 */public class GetTreeNodeMirror { public static void main(St
求二叉树的镜像(破坏二叉树和不破坏二叉树用递归实现求二叉树镜像) 求二叉树的镜像,破坏原来的二叉树(1)如果二叉树为空,返回空(2)如果二叉树不为空,求左子树和右子树的镜像(3)交换左子树和右子树 (4)原来的树根直接指向交换后的左子树和右子树求二叉树的镜像,不能破坏原来的二叉树实质跟上面一样,只是申请一个树根节点,最后指向交换后的左子树和右子树实现过程如下所示:package cn.edu.nwu.tree;
判断二叉树是不是平衡二叉树 判断二叉树是不是平衡二叉树 ,使用递归解法。平衡二叉树有个特点,就是左右子树之差绝对值不能大于1,所以需要借助二叉树深度,之前求出过二叉树深度(1)如果二叉树为空,返回真(2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,否则返回假package cn.edu.nwu.tree;/** * @author jcm *
判断两棵二叉树是否相同的树 判断两棵二叉树是否相同的树,递归实现方式是,需要知道递归的出口,(1)如果两棵二叉树都为空,返回真(2)如果两棵二叉树一棵为空,另一棵不为空,返回假(3)否则递归左子树和右子树如果是非递归实现判断两颗二叉树是否相同,可以按层次遍历,需要借助两个队列(1)在while循环内,如果两个当前节点都是空值,跳出本次循环继续下一次循环(2)如果两个当前节点都不为空,并且他
求解二叉树第K层节点数目 求解二叉树第K层节点数目,使用递归解法,第k层的节点数=第k-1层左孩子节点数+第k-1层右孩子节点数目,直到k==1时,说明已经到了第K层。非递归实现二叉树的第K层节点数目,需要借助队列,与求解二叉树深度相似,只是在while循环条件多加了判断k>1,如果k>1,说明已经遍历在k-1层,这样刚好在遍历的过程中已经求解出下一层的节点个数即第k层实现过程如下所示:package cn.e
输出二叉树叶子节点数目 输出二叉树叶子节点数目,用递归实现方式,如果二叉树是一个空树,则输出0,如果二叉树存在,则如果存在节点的左孩子和右孩子节点都是空,则返回1,否则递归左孩子和右孩子。非递归实现统计二叉树叶子节点数目,按层次遍历,需要借助队列来实现先定义一个变量,用来计数叶子节点根节点入队,在while循环的时候,先出队,然后用当前节点指向出队队头节点如果存在左孩子节点,则左孩子入队如果存在右孩子
层次遍历二叉树从上到下左往右遍历 层次遍历二叉树从上到下左往右遍历,需要借助队列来实现先初始化队列,将根节点压入队列当队列不为空,先出队,让当前节点指向出队的节点输出当前节点如果存在左孩子节点,左孩子入队如果存在右孩子节点,右孩子入队实现过程如下所示:package cn.edu.nwu.tree;import java.util.LinkedList;import java.
后续遍历二叉树 后续遍历二叉树,递归实现二叉树后续遍历,先递归左孩子节点,然后递归右孩子节点,最后输出节点值。非递归实现二叉树后续遍历,需要借助两个栈。非递归实现二叉树后续遍历,需要借助两个栈来实现第一个栈按前序遍历将二叉树节点压栈第二个栈是当第一个栈要出栈的时候,将当前出栈的节点压栈到第二个栈如果当前节点存在左孩子节点,则压栈到第一个栈如果当前节点存在右孩子节点,则压栈到第一个栈 最后当
中序遍历二叉树 中序遍历二叉树,递归实现中序遍历二叉树,先左孩子进栈,然后输出当前节点,最后右孩子进栈。非递归实现中序遍历二叉树,需要借助栈来实现。如果二叉树不为空,将二叉树的根节点压栈栈有个特点是先进后出,所以要先让左孩子一直进栈如果当前节点为空,则栈顶出栈,赋值给当前节点输出刚出栈的栈顶元素让当前节点的右孩子节点指向当前节点,接着下次循环,一直让左孩子进栈实现过程如下所示:
先序遍历二叉树 先序遍历二叉树,递归方式解决先序遍历二叉树,如果二叉树不为空,先输出二叉树节点,然后递归左孩子右孩子。非递归实现二叉树前序遍历,需要借助栈来实现如果二叉树不为空,将二叉树的根节点压栈栈有个特点是先进后出,所以要先让右孩子进栈,然后左孩子进栈在while循环的时候,先出栈,然后输出节点,如果当前节点存在右孩子,先把右孩子压栈如果当前节点存在左孩子,把左孩子压栈
二叉树的深度 二叉树的深度,递归实现,如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1,非递归实现,需要队列和两个变量分别是当前层节点数和下一层节点数,如果当前层节点数=0,说明已经访问完了,需要便利下一层,所以需要自增。实现过程如下所:package cn.edu.nwu.tree;import java.util.LinkedList;import java.ut
求二叉树节点 求二叉树节点,可以用递归方式实现,二叉树节点个数=左子树节点个数+右子树节点个数+1。非递归实现,需要借助队列来实现,按层次节点分别入队,并且每一次入队节点数自增。实现过程如下所示:package cn.edu.nwu.tree;import java.util.LinkedList;import java.util.Queue;/** * @author jcm * *时间 20
二叉树节点的定义和构造二叉树 定义二叉树节点,需要左右节点,和存放元素值。实现过程如下所示:package cn.edu.nwu.tree;/** * @author jcm * *时间 2016年9月15日 */public class TreeNode { int data; TreeNode leftChild; TreeNode rightRight; TreeNode(int data){
堆排序 堆排序实现过程如下所示:/** * @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}
希尔排序 希尔排序最基本还是是插入排序,只不过在插入排序的基础上,一次交换好多逆序,而插入排序一次只能交换一次逆序,所以希尔排序比起插入排序要快。其次计算间隔,是有个公式,即 h=3*h-1来计算间隔,间隔初始值是1,直到间隔的初始值大于数组的大小时停止,最大间隔不大于数组大小的最大值。实现过程如下所示:/** * @author jcm * *时间 2016年9月11日 */public
快速排序 快速排序,传进三个参数,分别是数组,左边和右边的大小。先判断左边是否小于右边,因为要递归,这作为递归的出口条件。然后在定义三个变量,分别是low,high和比较的关键字。完成一趟排序的时候,将关键字和当前high所指的这个元素进行交换。实现过程如下所示:/** * @author jcm * * 2016年8月6日 */public class QuickSort {
简单选择排序 简单选择排序,要选取一个关键字下标,与关键字作比较,如果小于关键字,则交换下标。实现过程如下所示:/** * @author jcm * *时间 2016年8月6日 */public class SelectSort { public static void main(String[] args) { int array[] = { 23, 18, 19, 17, 45, 8