1、深入java编程,专业教程,理论讲解部分,Ver3.1,第026课 算法及数据结构,概述:,树的查询结点的删除树的遍历,重点:,难点:,结点的删除树的遍历,树的查询 结点的删除,第026课 算法及数据结构,6.4 二叉树的查询,10,2,13,1,5,16,如图,该树便是一棵搜索二叉树.,下面我们要讨论如何查询到5所在的结点.,首先我们要访问根结点,判断根结点是否是要查询的目标.,510 ,所以根结点不是查询目标且目标可能在.其左子树内,6 二叉树,第026课 算法及数据结构,10,2,13,1,5,16,然后,对根的左子树进行检查.判断该子树根结点是否是要查询的目标.,25,则5可能在该子树
2、的右子树中.,6.4 二叉树的查询,6 二叉树,第026课 算法及数据结构,10,2,13,1,5,16,判断,该子树的根结点是否是要查找目标.,查找成功,返回该结点.,若查找到最后为空结点,其后再没有子树则判定树中无该结点,给出失败提示,6.4 二叉树的查询,6 二叉树,第026课 算法及数据结构,private Node getNode(int key) throws ExceptionNode result = root;while(result.key != key)if(key result.key)result = result.left;elseresult = result.r
3、ight;if(result = null)throw new Exception(“Cant find value by “+key);return result; ,这是插入结点代码的实现,其中 subtreeRoot是要查询子树的根newNode是要插入的结点,目标结点在当前结点的左子树,目标结点在当前结点的右子树,查询到最终子树没有目标结点,查到目标结点,6.4 二叉树的查询,6 二叉树,第026课 算法及数据结构,6.5 二叉树的删除,树的结点删除的操作相对繁琐一些.,10,2,13,1,5,16,如图,设我们将删除2这个结点.,由于要删除的结点下有两棵子树而父结点只能接收一棵子树,
4、所以有必要对其子树的结构做一些调整.,6 二叉树,第026课 算法及数据结构,10,2,13,1,5,16,查询的第一步首先要掌握目标结点(被删除结点)及其父结点.,其过程与查询类似,但要注意保留其父结点的引用.,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,13,1,5,16,获得目标结点及其父结点后要判断目标结点是其父结点的左子树还是右子树.,现2是10的左子树.,然后按照如下步骤进行.,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,13,1,5,16,将目标结点的左子树添加到其父结点的左子树中.,6.5 二叉树的删除,6 二叉树,第02
5、6课 算法及数据结构,10,2,13,1,5,16,将目标结点的右子树加入到其自己的左子树中,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,13,1,5,16,删除目标结点,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,13,1,5,16,整理后为,这是当目标结点为其父结点的左子树时的操作.,下面介绍,当目标结点为其父结点的右子树时的操作,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,13,1,12,16,如图,设我们将删除13这个结点.,查询等操作相同.以获得目标结点及其父结点,6.5 二叉树的删除,6 二叉树,第026课
6、 算法及数据结构,10,2,13,1,12,16,现已知目标结点与其父结点且目标结点为其父结点的右子树,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,13,1,12,16,首先将目标结点的右子树添加到其父结点的右子树中.,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,13,1,12,16,然后 将目标结点的左子树添加到其自身的左子树中.,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,1,12,16,最后 删除目标结点,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,10,2,1,12,16,整理后为,6
7、.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,public void delete(int key) throws ExceptionNode current = root;Node parent = null;while(current.key != key)parent = current;if(key current.key)current = current.left;elsecurrent = current.right;if(current = null)throw new Exception(“delete:Cant find value by “+key);if(
8、parent.left = current)parent.left = current.left;insertNode(parent,current.right);current = null;elseparent.right = current.right;insertNode(parent,current.left);current = null; ,这是插入结点代码的实现,其中 subtreeRoot是要查询子树的根newNode是要插入的结点,查询目标结点及其父结点,目标结点在其父结点的左子树,目标结点在其父结点的右子树,6.5 二叉树的删除,6 二叉树,第026课 算法及数据结构,6
9、.6 二叉树的遍历,二叉树的遍历分为:前序遍历 中序遍历 后序遍历.,前序遍历: 按照先访问根结点,然后分别访问其左子树 右子树.其子树的访 问顺序仍然按照该规则进行.,中序遍历: 按照先访问左子树,然后分别访问根结点.最后访问其右子树.其 子树的访问顺序仍然按照该规则进行.,后序遍历: 按照先分别访问其左子树 右子树,最后访问其根结点.其子树的 访问顺序仍然按照该规则进行.,6 二叉树,第026课 算法及数据结构,这里主要介绍一下前序遍历的递归方法.其余遍历类似.,public void preOrder(Node subtreeRoot)if(subtreeRoot != null)Sys
10、tem.out.print(“ “+subtreeRoot+“ “);preOrder(subtreeRoot.left);preOrder(subtreeRoot.right); ,6.6 二叉树的遍历,6 二叉树,第026课 算法及数据结构,这里主要介绍一下前序遍历的递归方法.其余遍历类似.,public void preOrder(Node subtreeRoot)if(subtreeRoot != null)System.out.print(“ “+subtreeRoot+“ “);preOrder(subtreeRoot.left);preOrder(subtreeRoot.right); ,将访问结点输出,访问其左子树,访问其右子树,关于二叉树其完整代码参见MyTrea.java,6.6 二叉树的遍历,6 二叉树,小结:,树的查询树的删除树的遍历,第026课 算法及数据结构,1、简述二叉树的查询过程. 2、简述二叉树删除过程 3、说明前序 中序 后序遍历的区别.,小测验:,第026课 算法及数据结构,熟悉树的结构及操作重新完成树的所有操作.包括树的创建 插入 查询 删除 遍历,课后作业:,第026课 算法及数据结构,