
数据结构
honbaa
这个作者很懒,什么都没留下…
展开
-
非递归遍历二叉树小结
从步骤的难易程度看,先根非递归最简单了。中根非递归和后根非递归是类似的。非递归使用栈的出栈和进栈操作将递归的效果做出来了。左孩子和右孩子,根这3个对象的进栈顺序是独特的。不能随意改变。想起一句话:做一个优秀的工程师,你就成功了。原创 2016-01-20 17:27:35 · 408 阅读 · 0 评论 -
后根非递归遍历
因为有了中根非递归遍历的步骤,在最初设计的时候,考虑了“左右孩子与根“入栈的顺序。中根入栈的顺序是”右根左“,则后根入栈的顺序则是”根右左“。通过草稿模拟整个过程,发现后根遍历的步骤与中根遍历的步骤,仅仅在上面所说的入栈顺序上。这就避免了非递归遍历二叉树造成的思路不一致性。人们总想要一致的步骤去解决同一类型的问题。具体的设计步骤如下:根r入栈swhile原创 2016-01-20 17:13:08 · 484 阅读 · 0 评论 -
中根非递归遍历二叉树
在先根非递归中,根入栈后弹出,访问,右孩子与左孩子进栈,顺序很清楚。但是中根非递归与后根非递归中,根入栈后如果弹出不能访问,这是一个困惑的地方。为了更明晰地,更统一3种非递归设计思路。均可以采用入栈,弹出,左右子树入栈这种基本步骤。每个步骤需要仔细在纸上演示设计。经过一些例子演示。设计一种中根非递归的解决步骤:根r入栈swhile(s不空){栈顶he原创 2016-01-20 12:13:33 · 520 阅读 · 0 评论 -
先根非递归遍历二叉树
递归是自己调用自己,使用同一的办法解决子问题。非递归则不再自己调用自己了。使用栈模拟递归调用的过程。如对先根遍历,设计其非递归步骤:设置栈ss.enStack(root)//根入栈while(s不空){栈顶head出栈,访问栈顶s.enStack(head.right)//非空右子树入栈s.enStack(head.left)//原创 2016-01-20 11:42:14 · 453 阅读 · 0 评论 -
遍历二叉树小结
二叉树将其分为根(B,base),左子树(L,left),右子树(R,right)表示。则遍历树就是遍历B,L和R的过程,对3个组件进行排列,实际有3*2*1=6种。DLR,LDR,LRDRLD,RDL,DRL其本质类似。默认情况,将L和R的顺序确定下来,先L后R。则只剩下3种常说的,先根,中根,后根。递归的思路:递归就是自己调用自己,用同样办法解决子问题。如先根遍原创 2016-01-20 10:37:02 · 342 阅读 · 0 评论 -
二叉链表和三叉链表
前面创建二叉树时,Node的定义中包含左右连个后继,则这种链表就是二叉链表。三叉链表在二叉链表节点基础上,增加一个父亲前驱。这样给定任何一个节点,就可以访问到它的父亲。原创 2016-01-20 10:23:53 · 4893 阅读 · 0 评论 -
完全二叉树用数组存
完成二叉树因为其编号从上到下,从左到右依次排放节点。所以直观上节点是“紧密”存储在一起的。任何一颗二叉树当然可以使用链式存储。单完全二叉树因其紧密存储的特点,可以使用一位数组存储。只需要按照层序依次将节点放入队列中就ok了。按层访问二叉树在前面已经介绍,但是访问队列是临时的,采取了出队操作。这里要保存数据的话,就不要出队操作了。无论是链式存储还是数组存,都需要访问里原创 2016-01-20 10:10:40 · 6186 阅读 · 0 评论 -
两种常用特殊二叉树
二叉树中,每个节点有0或1或2个孩子。对孩子的个数限制:如果每个内节点都有2个孩子,那么这个数就是满二叉树。如果一个满二叉树,除了最后一层,其余各层都是满的,并且最后一层或者是满,或者仅右边缺少连续若干节点,那么称为完全二叉树。满二叉树和完全二叉树都对节点进行了统一、确定的编号。每个节点在树中都有确定的位置。这2种树的性质,通过画图、推到可以容易得出。主要是高度原创 2016-01-20 09:42:38 · 552 阅读 · 0 评论 -
层序遍历二叉树-测试
java代码://层序遍历public void levelOrder(){Queue q = new LinkedList();if(root!=null)q.add(root);//根入队列while(!q.isEmpty())//队列不空{Node n = q.peek();if(n.left!=null)q.add(n.left);//队头有原创 2016-01-19 20:37:45 · 445 阅读 · 0 评论 -
按照层序,从左到右遍历
给一个二叉树root,从root开始,按照层序从上到下,从左到右打印。对于先序创建的二叉树:124##5##3层序遍历节点的顺序为:12345设计一个能够完成这样的任务的执行步骤:由root,开始,打印root//第一层打印root.left打印root.right//第二层再打印root.left.left再打印root.left.right在原创 2016-01-19 20:11:50 · 480 阅读 · 0 评论 -
Node定义
package binarytree;public class Node {// 节点是一个包含“key-value”的对象K key;V value;Node left;Node right;boolean isNull = false;// 如果为true,则说明此节点是null节点。public Node(K k,V v){key = k;valu原创 2016-01-19 16:50:22 · 815 阅读 · 0 评论 -
注意-引用复制
在create(Node n)方法中,如果将树根root传入,变量n会复制root的值。n是树根,而root仍然是null。n和root是2个不同的变量。所以,方法需要返回树根,以此改变root的值。原创 2016-01-19 16:36:57 · 366 阅读 · 0 评论 -
二叉树创建-代码
package binarytree;import java.util.ArrayList;public class BinaryTree {// 二叉树本身的成员Node root;int size;// 操作// 初始化空树public BinaryTree() {root = null;size = 0;}// 建立的树的初始节点数组Arr原创 2016-01-19 16:33:55 · 2467 阅读 · 0 评论 -
测试创建 二叉树
package test;import java.util.ArrayList;import org.junit.Before;import org.junit.Test;import binarytree.BinaryTree;import binarytree.Node;public class TestBinaryTree {BinaryT原创 2016-01-19 16:29:59 · 1090 阅读 · 0 评论 -
二叉树创建-思路
输入数据的格式为: 124##5##3 其中#表示null节点。 采用先序创建,即根左右的方式递归。核心的递归方法包含一个Node参数。假设是这样的: Node create(root r) { //首先拿过来一个节点 Node n = getNextNode(); //判定这个是不是null节点 if(node.isNullNode)原创 2016-01-19 09:48:29 · 835 阅读 · 0 评论 -
二叉树创建-前言
如果我自己都理不清一个算法的步骤,什么时候开始,什么时候结束,那么就不可能写出正确的代码。解决一个算法或者操作的时候,首先想想,再拿出笔画一画,我的程序需要对输入数据做怎样的处理,我需要什么样的目标,通过哪些步骤才能最终形成这个目标呢?如果弄懂了这些步骤,那么一个正确的算法自然就出现了。所以,正确的算法或程序就是编程者的孩子,编写程序的人知道任何与自己孩子有关的事情。原创 2016-01-19 09:40:32 · 267 阅读 · 0 评论 -
二叉树定义--有序树
二叉树拥有的基本成员: 树根 左子树 右子树 元素个数 。。。 支持操作: 增删改查。。。二叉树是一种特殊的树,它的左右子树不能交换。为了方便表示二叉树,使用“括号”表示法如(A(B,C))表示包含3个节点的二叉树,A是跟,B是左孩子,C是右孩子。就像前面说的,二叉树重要的应用是作为一种符号表存储key-value.以便支持根据Key查找value 。从这里就把节点定义为包含一个key原创 2016-01-18 15:07:47 · 3514 阅读 · 0 评论 -
二叉树(binary tree)-重要性
二叉树是一种最简单、最基础、最重要的树结构。它能: 支持强大的搜索算法; 链式结构按照需要分配内存; 有规则的存储对象; ….能想到的讨论集中在搜索和存储方面;它同时是一种数据结构,或数据类型,或容器,面向对象的方式思考的话,作为一个类。二叉树存储元素涉及2个普遍的,所有容器都涉及的操作:增加和删除;二叉树之所以重要,是因为它支持或拥有的操作,包括增删改查重要的操作,复杂度比完成同样功能的其原创 2016-01-18 10:45:22 · 2885 阅读 · 0 评论 -
继续每日数据结构
由于发表论文等相关事项,耽搁了2个多月。现在有自己的一点点时间,就继续思考、记录数据结构方面的东西吧原创 2016-01-18 10:36:52 · 369 阅读 · 0 评论 -
coursera
Algorithmic Thinkinghttps://class.coursera.org/algorithmicthink-001/lecture原创 2014-09-04 16:07:42 · 988 阅读 · 0 评论 -
了解LLRB(左倾斜红黑树)-从2-3树到LLRB
LLRB具有perfect black balance的特性.原创 2014-07-09 11:49:39 · 2850 阅读 · 0 评论 -
了解2-3tree(无代码)
2-3 tree是一种perfect balance的结构。它是建立原创 2014-07-03 14:13:03 · 797 阅读 · 0 评论 -
对BST的测试用例(使用junit4)
对上文BST的9个api的实现进行测试(除了size()方法),size(原创 2014-07-02 21:37:15 · 2159 阅读 · 0 评论 -
BST小结
BST作为符号表的数据结构,很重要的一种。本文将前文中的实现内容汇聚在一起,共同构成BST这个类型的一个实现版本。下面是api原创 2014-07-02 21:30:50 · 614 阅读 · 0 评论 -
BST中与顺序有关的另外2个api实现与测试
这2个 api是基于比较的,与rank和select非常相似,都是原创 2014-07-02 20:52:18 · 466 阅读 · 0 评论 -
BST中与顺序有关的2个api及实现
在bST中,有如下与顺序有关的apipublic int rank(Key k)原创 2014-07-02 13:51:26 · 556 阅读 · 0 评论 -
BST查询,插入,删除api实现与测试
BST是一种经典数据结果,本文使用java实现一次“增删查”操作。原创 2014-07-02 00:42:50 · 1368 阅读 · 0 评论