收藏 分享(赏)

《数据结构Java版》习题解答..doc

上传人:彼岸花开 文档编号:3889357 上传时间:2018-11-25 格式:DOC 页数:37 大小:209.74KB
下载 相关 举报
《数据结构Java版》习题解答..doc_第1页
第1页 / 共37页
《数据结构Java版》习题解答..doc_第2页
第2页 / 共37页
《数据结构Java版》习题解答..doc_第3页
第3页 / 共37页
《数据结构Java版》习题解答..doc_第4页
第4页 / 共37页
《数据结构Java版》习题解答..doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

1、第 0 章 Java 程序设计基础.1【习 0.1】 实验 0.1 哥德巴赫猜想。 1【习 0.2】 实验 0.2 杨辉三角形。 1【习 0.3】 实验 0.3 金额的中文大写形式。 1【习 0.4】 实验 0.4 下标和相等的数字方阵。 1【习 0.5】 实验 0.5 找出一个二维数组的鞍点 2【习 0.6】 实验 0.6 复数类。 2【习 0.7】 实验 0.8 图形接口与实现图形接口的类 2第 1 章 绪论3【习 1.1】 实验 1.1 判断数组元素是否已按升序排序。 3【习 1.2】 实验 1.3 用递归算法求两个整数的最大公因数。 3第 2 章 线性表5【习 2.1】 习 2-5 图

2、 2.19 的数据结构声明。 .5【习 2.2】 习 2-6 如果在遍历单链表时,将 p=p.next 语句写成 p.next=p,结果会怎样? .5【习 2.3】 实验 2.2 由指定数组中的多个对象构造单链表。 5【习 2.4】 实验 2.2 单链表的查找、包含、删除操作详见 8.2.1。 .5【习 2.5】 实验 2.2 单链表的替换操作。 6【习 2.6】 实验 2.2 首尾相接地连接两条单链表。 6【习 2.7】 实验 2.2 复制单链表。 6【习 2.8】 实验 2.2 单链表构造、复制、比较等操作的递归方法。 7【习 2.9】 建立按升序排序的单链表(不带头结点)。 8【习 2.

3、10】 实验 2.6 带头结点的循环双链表类,实现线性表接口。 10【习 2.11】 实验 2.5 建立按升序排序的循环双链表。 14第 3 章 栈和队列17【习 3.1】 习 3-5 栈和队列有何异同? 17【习 3.2】 能否将栈声明为继承线性表,入栈方法是 add(0,e),出栈方法是 remove(0)?为什么? 17【习 3.3】 能否用一个线性表作为栈的成员变量,入栈方法是 add(0,e),出栈方法是remove(0)?为什么? .17【习 3.4】 能否将队列声明为继承线性表,入队方法是 add(e),出队方法是 remove(0)?为什么? 17第 4 章 串18【习 4.1

4、】 实验 4.6 找出两个字符串中所有共同的字符。 18【习 4.2】 习 4-9(1) 已知目标串为“abbaba“、模式串为“aba“,画出其 KMP 算法的匹配过程,并给出比较次数。 18【习 4.3】 习 4-9(2) 已知 target=“ababaab“、pattern=“aab“,求模式串的 next 数组,画出其KMP 算法的匹配过程,并给出比较次数。 18第 5 章 数组和广义表20【习 5.1】 求一个矩阵的转置矩阵。 20第 6 章 树和二叉树21【习 6.1】 画出 3 个结点的各种形态的树和二叉树。 21【习 6.2】 找出分别满足下面条件的所有二叉树。 21【习 6

5、.3】 输出叶子结点。 21【习 6.4】 求一棵二叉树的叶子结点个数。 22【习 6.5】 判断两棵二叉树是否相等。 22【习 6.6】 复制一棵二叉树。 23【习 6.7】 二叉树的替换操作。 23【习 6.8】 后根次序遍历中序线索二叉树。 24第 7 章 图25第 8 章 查找26【习 8.1】 实验 8.1 顺序表的查找、删除、替换、比较操作。 26【习 8.2】 实验 8.2 单链表的全部替换操作。 28【习 8.3】 实验 8.2 单链表的全部删除操作。 28【习 8.4】 折半查找的递归算法。 29【习 8.5】 二叉排序树查找的递归算法。 29【习 8.6】 二叉排序树插入结

6、点的非递归算法。 30【习 8.7】 判断一棵二叉树是否为二叉排序树。 31第 9 章 排序32【习 9.1】 判断一个数据序列是否为最小堆序列。 32【习 9.2】 归并两条排序的单链表。 32【习 9.3】 说明二叉排序树与堆的差别。 34图 0.1 下标和相等的数字方阵算法描述 1图 2.1 p.next=p 将改变结点间的链接关系 5图 4.1 目标串“abbaba“和模式串“aba“的 KMP 算法模式匹配过程 18图 4.2 目标串“ababaab“ 和模式串“aab“的 KMP 算法模式匹配过程 19图 6.1 3 个结点树和二叉树的形态 21图 6.2 单支二叉树 21图 9.

7、2 归并两条排序的单链表 33表 4.1 模式串“aab“的 next 数组 .19第 0 章 Java 程序设计基础【习 0.1】 实验 0.1 哥德巴赫猜想。【习 0.2】 实验 0.2 杨辉三角形。【习 0.3】 实验 0.3 金额的中文大写形式。【习 0.4】 实验 0.4 下标和相等的数字方阵。输出下列方阵(当 n=4 时) 。1 2 6 7 或 1 3 4 103 5 8 13 2 5 9 114 9 12 14 6 8 12 1510 11 15 16 7 13 14 16采用二维数组实现。二维数组中,每一条斜线上各元素下标和相等,如图 0.1 所示。j 126735813491

8、21410115160123123i = 右 下 三 角下 标 和 为 n 2*n-左 上 三 角下 标 和 为 0 n-1 下 标 和 为 4下 标 和 为 5下 标 和 为 6图 0.1 下标和相等的数字方阵算法描述程序如下。public class Upmatpublic static void main(String args) int n=4; /阶数int mat = new intnn;int k=1; /k 是自然数,递增变化boolean up = true; /方向向上for (int sum=0; sum=0; i-)matisum-i = k+; /k 先赋值后自加el

9、sefor (int i=0; isum-n; j-)matsum-jj = k+;up=!up;for (int i=0; itablei+1)return false;return true;public static boolean isSorted(Comparable table) /判断对象数组是否已按升序排序 /若已排序返回 true,否则返回 falseif (table=null)return false;for (int i=0; i0)return false;return true;【习 1.2】 实验 1.3 用递归算法求两个整数的最大公因数。public class

10、 Gcdpublic static int gcd(int a, int b) /返回 a,b 的最大公因数,递归方法if(b=0)return a;if(a table【习 2.2】 习 2-6 如果在遍历单链表时,将 p=p.next 语句写成 p.next=p,结果会怎样?使 p.next 指向 p 结点自己,改变了结点间的链接关系,丢失后继结点,如图 2.1 所示。Ahead BCD图 2.1 p.next=p 将改变结点间的链接关系【习 2.3】 实验 2.2 由指定数组中的多个对象构造单链表。在 SinglyLinkedList 单链表类中,增加构造方法如下。public Sing

11、lyLinkedList(E element) /由指定数组中的多个对象构造单链表this.head = null;if (element!=null Node rear=this.head;int i=1;while (i search(E element, Node start) /从单链表结点 start 开始顺序查找指定对象public Node search(E element) /若查找到指定对象,则返回结点,否则返回nullpublic boolean contain(E element) /以查找结果判断单链表是否包含指定对象public boolean remove(E el

12、ement) /移去首次出现的指定对象【习 2.5】 实验 2.2 单链表的替换操作。在 SinglyLinkedList 单链表类中,增加替换操作方法如下。public boolean replace(Object obj, E element) /将元素值为 obj 的结点值替换为 element /若替换成功返回 true,否则返回false,O(n)if (obj=null | element=null)return false;Node p=this.head;while (p!=null)if (obj.equals(p.data)p.data = element;return t

13、rue;p = p.next;return false;【习 2.6】 实验 2.2 首尾相接地连接两条单链表。在 SinglyLinkedList 单链表类中,增加替换操作方法如下。public void concat(SinglyLinkedList list) /将指定单链表 list 链接在当前单链表之后if (this.head=null)this.head = list.head;elseNode p=this.head;while (p.next!=null)p = p.next;p.next = list.head;【习 2.7】 实验 2.2 复制单链表。在 SinglyLi

14、nkedList 单链表类中,增加构造方法如下。public SinglyLinkedList(SinglyLinkedList list) /以单链表 list 构造新的单链表 /复制单链表this.head = null;if (list!=null Node p = list.head.next;Node rear = this.head;while (p!=null)rear.next = new Node(p.data);rear = rear.next; p = p.next;【习 2.8】 实验 2.2 单链表构造、复制、比较等操作的递归方法。由指定数组中的多个对象构造单链表的操

15、作也可设计为以下的递归方法:public SinglyLinkedList(E element) /由指定数组中的多个对象构造单链表this.head = null;if (element!=null)this.head = create(element,0);private Node create(E element, int i) /由指定数组构造单链表,递归方法 Node p=null;if (i list) /以单链表 list 构造新的单链表this.head = copy(list.head);private Node copy(Node p) /复制单链表,递归方法Node q=

16、null;if (p!=null)q = new Node(p.data);q.next = copy(p.next); return q;比较两条单链表是否相等的操作也可设计为以下的递归方法:public boolean equals(Object obj) /比较两条单链表是否相等if (obj = this)return true;if (obj instanceof SinglyLinkedList)SinglyLinkedList list = (SinglyLinkedList)obj;return equals(this.head, list.head);return false

17、;private boolean equals(Node p, Node q) /比较两条单链表是否相等,递归方法if (p=null if (p!=null return false;【习 2.9】 建立按升序排序的单链表(不带头结点) 。采用直接插入排序算法将一个结点插入到已排序的单链表中。import dataStructure.linearList.Node; import dataStructure.linearList.SinglyLinkedList; /不带头结点的单链表类public class SortedSinglyLinkedList extends SinglyLin

18、kedListpublic SortedSinglyLinkedList() super();public boolean add(E element) /根据指定对象的大小插入在合适位置if (element=null | !(element instanceof Comparable)return false; /不能插入 null 或非 Comparable 对象Comparable cmp = (Comparable)element;if (this.head=null | pareTo(this.head.data)(element,this.head); /头插入elseNode

19、front=null, p=this.head;while (p!=null /front 是 p 的前驱结点p = p.next;front.next = new Node(element, p); /中间/尾插入return true;public static void main(String args)SortedSinglyLinkedList list = new SortedSinglyLinkedList();int n=10;System.out.print(“insert: “);for (int i=0; i implements LList /带头结点的循环双链表类pr

20、otected DLinkNode head; /头指针public CHDoublyLinkedList() /构造空链表this.head = new DLinkNode(); /创建头结点,值为 nullthis.head.prev = head;this.head.next = head;public boolean isEmpty() /判断双链表是否为空return head.next=head;/以下算法同循环单链表,与单链表的差别在于,循环条件不同 public int length() /返回双链表长度int i=0; DLinkNode p=this.head.next;

21、/此句与单链表不同while (p!=head) /循环条件与单链表不同i+;p = p.next;return i;public E get(int index) /返回序号为 index 的对象if (index=0)int j=0; DLinkNode p=this.head.next;while (p!=head DLinkNode p=this.head.next;while (p!=head while (p!=head) str += p.data.toString();p = p.next;if (p!=head) str += “, “;return str+“)“;/双链表

22、的插入、删除算法与单链表不同public boolean add(int index, E element) /插入 element 对象,插入后对象序号为 index /若操作成功返回 true,O(n)if (element=null)return false; /不能添加空对象(null)int j=0;DLinkNode front = this.head;while (front.next!=head /插入在 front 结点之后front.next.prev = q;front.next = q;return true;public boolean add(E element)

23、/在单链表最后添加对象,O(1)if (element=null)return false; /不能添加空对象(null)DLinkNode q = new DLinkNode(element, head.prev, head); head.prev.next = q; /插入在头结点之前,相当于尾插入head.prev = q;return true;public E remove(int index) /移除指定位置的对象,O(n) /返回被移除的原对象,指定位置序号错误时返回 nullE old = null;int j=0; DLinkNode p=this.head.next;whi

24、le (p!=head System.out.println(“删除第“+i+“个结点“+list.remove(0);System.out.println(list.toString();for (i=5; i=0; i-)list.add(0, new String(char)(A+i)+“);for (i=0; i extends CHDoublyLinkedList /按升序排序的循环双链表类public SortedCHDLinkedList() super();public boolean add(E element) /根据指定对象的大小插入在合适位置 /若操作成功返回 true

25、,O(n)if (element=null | !(element instanceof Comparable)return false; /不能插入 null 或非 Comparable 对象Comparable cmp = (Comparable)element;if (this.head.prev!=head head.prev.next = q; /插入在头结点之前,相当于尾插入head.prev = q;return true;DLinkNode p=this.head.next;while (p!=head DLinkNode q = new DLinkNode(element,

26、p.prev, p); /插入在 p 结点之前p.prev.next = q;p.prev = q;return true;public boolean remove(E element) /删除指定对象 /若操作成功返回 true,O(n)if (element=null | !(element instanceof Comparable)return false;Comparable cmp = (Comparable)element;DLinkNode p=this.head.next;while (p!=head if (p!=head)p.prev.next = p.next; /删

27、除 p 结点自己p.next.prev = p.prev;return true;return false; /未找到指定结点,删除不成功public static void main(String args)SortedCHDLinkedList list = new SortedCHDLinkedList();int n=10;System.out.print(“insert: “);for (int i=0; i p) /先根次序遍历,输出叶子结点,3 种遍历次序结果一样if(p!=null)if (p.isLeaf()System.out.print(p.data+“ “);leaf(

28、p.left);leaf(p.right);【习 6.4】 求一棵二叉树的叶子结点个数。在 BinaryTree 类中增加以下方法。public int countLeaf() /求一棵二叉树中所有叶子结点个数return countLeaf(root);public int countLeaf(BinaryNode p) /求以 p 结点为根的子树的叶子结点个数if (p=null)return 0;if (p.isLeaf()return 1;return countLeaf(p.left)+countLeaf(p.right);【习 6.5】 判断两棵二叉树是否相等。public boo

29、lean equals(Object obj) /比较两棵二叉树是否相等,BinaryTree 类中方法if (obj = this)return true;if (obj instanceof BinaryTree)BinaryTree bitree = (BinaryTree)obj;return equals(this.root, bitree.root);return false;private boolean equals(BinaryNode p, BinaryNode q) /判断两棵子树是否相等,递归方法 if(p=null if(p!=null return false;【习

30、 6.6】 复制一棵二叉树。在 BinaryTree 类中增加以下构造方法,以已知的 bitree 构造二叉树构造一棵二叉树。public BinaryTree(BinaryTree bitree) /以已知的 bitree 构造二叉树this.root = copy(bitree.root);public BinaryNode copy(BinaryNode p) /复制以 p 根的子二叉树BinaryNode q = null;if(p!=null)q = new BinaryNode(p.data);q.left = copy(p.left); /复制左子树q.right = copy(

31、p.right); /复制右子树return q; /返回建立子树的根结点【习 6.7】 二叉树的替换操作。public boolean replace(E old, E value) /将首次出现的值为 old 结点值替换为valueBinaryNode find=search(old); /查找值为 old 的结点if(find!=null)find.data = value; /替换结点元素值return find!=null; public void replaceAll(E old, E value) /将值为 old 的结点全部替换为 valuereplaceAll(root, o

32、ld, value);public void replaceAll(BinaryNode p, E old, E value) /在以 p 为根的子树中实现全部替换if(p!=null)if(p.data.equals(old) p.data = value;replaceAll(p.left, old, value);replaceAll(p.right, old, value);【习 6.8】 后根次序遍历中序线索二叉树。在中序线索二叉树类 ThreadBinaryTree 中,增加以下方法,实现后根次序遍历。public ThreadBinaryNode postPrevious(Thr

33、eadBinaryNode p) /返回 p 在后根次序下的前驱if(p.rtag=0) /若右子树非空p=p.right; /右孩子是 p 的前驱结点else /否则,前驱是左兄弟或某个中序祖先的左孩子while(p.ltag=1 /寻找其某个中序祖先p=p.left; /左孩子是 p 的前驱结点return p;public void postOrder_previous() /后根次序遍历中序线索二叉树ThreadBinaryNode p=root;if(p!=null)System.out.print(“后根次序遍历(反序): “);doSystem.out.print(p.data+

34、“ “);p=postPrevious(p); /返回 p 在后根次序下的前驱结点 while(p!=null);System.out.println();第 7 章 图第 8 章 查找【习 8.1】 实验 8.1 顺序表的查找、删除、替换、比较操作。程序见顺序表类 SeqList.java。public int lastIndexOf(E element) /返回 obj 对象最后出现位置,若未找到返回-1if (obj!=null)for (int i=this.n-1; i=0; i-)if (obj.equals(this.tablei)return i;return -1;public boolean remove(E element) /移去首次出现的 obj 对象,若操作成功返回trueif (this.n!=0 return false;public boolean removeAll(E element) /移去线性表中所有 obj 对象boolean done=false;if (this.n!=0 while (i list = (SeqList)obj;for (int i=0; ithis.length(); i+)if (!(this.get(i).equals(list.get(i)return false; return true;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报