亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java實現二叉樹查找樹

2019-11-15 00:38:43
字體:
來源:轉載
供稿:網友
java實現二叉樹查找樹

二叉樹(binary)是一種特殊的樹。二叉樹的每個節點最多只能有2個子節點:

二叉樹

由于二叉樹的子節點數目確定,所以可以直接采用上圖方式在內存中實現。每個節點有一個左子節點(left children)和右子節點(right children)。左子節點是左子樹的根節點,右子節點是右子樹的根節點。

如果我們給二叉樹加一個額外的條件,就可以得到一種被稱作二叉搜索樹(binary search tree)的特殊二叉樹。二叉搜索樹要求:每個節點都不比它左子樹的任意元素小,而且不比它的右子樹的任意元素大。

(如果我們假設樹中沒有重復的元素,那么上述要求可以寫成:每個節點比它左子樹的任意節點大,而且比它右子樹的任意節點小)

二叉搜索樹,注意樹中元素的大小

二叉搜索樹可以方便的實現搜索算法。在搜索元素x的時候,我們可以將x和根節點比較:

1. 如果x等于根節點,那么找到x,停止搜索 (終止條件)

2. 如果x小于根節點,那么搜索左子樹

3. 如果x大于根節點,那么搜索右子樹

二叉搜索樹所需要進行的操作次數最多與樹的深度相等。n個節點的二叉搜索樹的深度最多為n,最少為log(n)。

下面是用java實現的二叉搜索樹,并有搜索,插入,刪除,尋找最大最小節點的操作。

刪除節點相對比較復雜。刪除節點后,有時需要進行一定的調整,以恢復二叉搜索樹的性質(每個節點都不比它左子樹的任意元素小,而且不比它的右子樹的任意元素大)。

  • 葉節點可以直接刪除。
  • 刪除非葉節點時,比如下圖中的節點8,我們可以刪除左子樹中最大的元素(或者右樹中最大的元素),用刪除的節點來補充元素8產生的空缺。但該元素可能也不是葉節點,所以它所產生的空缺需要其他元素補充…… 直到最后刪除一個葉節點。上述過程可以遞歸實現。

刪除節點

刪除節點后的二叉搜索樹

import java.util.ArrayList;import java.util.List;public class BinarySearchTree {// 樹的根結點PRivate TreeNode root = null;// 遍歷結點列表private List<TreeNode> nodelist = new ArrayList<TreeNode>();private class TreeNode {private int key;private TreeNode leftChild;private TreeNode rightChild;private TreeNode parent;public TreeNode(int key, TreeNode leftChild, TreeNode rightChild,TreeNode parent) {this.key = key;this.leftChild = leftChild;this.rightChild = rightChild;this.parent = parent;}public int getKey() {return key;}public String toString() {String leftkey = (leftChild == null ? "" : String.valueOf(leftChild.key));String rightkey = (rightChild == null ? "" : String.valueOf(rightChild.key));return "(" + leftkey + " , " + key + " , " + rightkey + ")";}}/** * isEmpty: 判斷二叉查找樹是否為空;若為空,返回 true ,否則返回 false . *  */public boolean isEmpty() {if (root == null) {return true;} else {return false;}}/** * TreeEmpty: 對于某些二叉查找樹操作(比如刪除關鍵字)來說,若樹為空,則拋出異常。 */public void TreeEmpty() throws Exception {if (isEmpty()) {throw new Exception("樹為空!");}}/** * search: 在二叉查找樹中查詢給定關鍵字 *  * @param key *            給定關鍵字 * @return 匹配給定關鍵字的樹結點 */public TreeNode search(int key) {TreeNode pNode = root;while (pNode != null && pNode.key != key) {if (key < pNode.key) {pNode = pNode.leftChild;} else {pNode = pNode.rightChild;}}return pNode;}/** * minElemNode: 獲取二叉查找樹中的最小關鍵字結點 *  * @return 二叉查找樹的最小關鍵字結點 * @throws Exception *             若樹為空,則拋出異常 */public TreeNode minElemNode(TreeNode node) throws Exception {if (node == null) {throw new Exception("樹為空!");}TreeNode pNode = node;while (pNode.leftChild != null) {pNode = pNode.leftChild;}return pNode;}/** * maxElemNode: 獲取二叉查找樹中的最大關鍵字結點 *  * @return 二叉查找樹的最大關鍵字結點 * @throws Exception *             若樹為空,則拋出異常 */public TreeNode maxElemNode(TreeNode node) throws Exception {if (node == null) {throw new Exception("樹為空!");}TreeNode pNode = node;while (pNode.rightChild != null) {pNode = pNode.rightChild;}return pNode;}/** * successor: 獲取給定結點在中序遍歷順序下的后繼結點 *  * @param node *            給定樹中的結點 * @return 若該結點存在中序遍歷順序下的后繼結點,則返回其后繼結點;否則返回 null * @throws Exception */public TreeNode successor(TreeNode node) throws Exception {if (node == null) {return null;}// 若該結點的右子樹不為空,則其后繼結點就是右子樹中的最小關鍵字結點if (node.rightChild != null) {return minElemNode(node.rightChild);}// 若該結點右子樹為空TreeNode parentNode = node.parent;while (parentNode != null && node == parentNode.rightChild) {node = parentNode;parentNode = parentNode.parent;}return parentNode;}/** * precessor: 獲取給定結點在中序遍歷順序下的前趨結點 *  * @param node *            給定樹中的結點 * @return 若該結點存在中序遍歷順序下的前趨結點,則返回其前趨結點;否則返回 null * @throws Exception */public TreeNode precessor(TreeNode node) throws Exception {if (node == null) {return null;}// 若該結點的左子樹不為空,則其前趨結點就是左子樹中的最大關鍵字結點if (node.leftChild != null) {return maxElemNode(node.leftChild);}// 若該結點左子樹為空TreeNode parentNode = node.parent;while (parentNode != null && node == parentNode.leftChild) {node = parentNode;parentNode = parentNode.parent;}return parentNode;}/** * insert: 將給定關鍵字插入到二叉查找樹中 *  * @param key *            給定關鍵字 */public void insert(int key) {TreeNode parentNode = null;TreeNode newNode = new TreeNode(key, null, null, null);TreeNode pNode = root;if (root == null) {root = newNode;return;}while (pNode != null) {parentNode = pNode;if (key < pNode.key) {pNode = pNode.leftChild;} else if (key > pNode.key) {pNode = pNode.rightChild;} else {// 樹中已存在匹配給定關鍵字的結點,則什么都不做直接返回return;}}if (key < parentNode.key) {parentNode.leftChild = newNode;newNode.parent = parentNode;} else {parentNode.rightChild = newNode;newNode.parent = parentNode;}}/** * insert: 從二叉查找樹中刪除匹配給定關鍵字相應的樹結點 *  * @param key *            給定關鍵字 */public void delete(int key) throws Exception {TreeNode pNode = search(key);if (pNode == null) {throw new Exception("樹中不存在要刪除的關鍵字!");}delete(pNode);}/** * delete: 從二叉查找樹中刪除給定的結點. *  * @param pNode *            要刪除的結點 *  *            前置條件: 給定結點在二叉查找樹中已經存在 * @throws Exception */private void delete(TreeNode pNode) throws Exception {if (pNode == null) {return;}if (pNode.leftChild == null && pNode.rightChild == null) { // 該結點既無左孩子結點,也無右孩子結點TreeNode parentNode = pNode.parent;if (pNode == parentNode.leftChild) {parentNode.leftChild = null;} else {parentNode.rightChild = null;}return;}if (pNode.leftChild == null && pNode.rightChild != null) { // 該結點左孩子結點為空,右孩子結點非空TreeNode parentNode = pNode.parent;if (pNode == parentNode.leftChild) {parentNode.leftChild = pNode.rightChild;pNode.rightChild.parent = parentNode;} else {parentNode.rightChild = pNode.rightChild;pNode.rightChild.parent = parentNode;}return;}if (pNode.leftChild != null && pNode.rightChild == null) { // 該結點左孩子結點非空,右孩子結點為空TreeNode parentNode = pNode.parent;if (pNode == parentNode.leftChild) {parentNode.leftChild = pNode.leftChild;pNode.rightChild.parent = parentNode;} else {parentNode.rightChild = pNode.leftChild;pNode.rightChild.parent = parentNode;}return;}// 該結點左右孩子結點均非空,則刪除該結點的后繼結點,并用該后繼結點取代該結點TreeNode successorNode = successor(pNode);delete(successorNode);pNode.key = successorNode.key;}/** * inOrderTraverseList: 獲得二叉查找樹的中序遍歷結點列表 *  * @return 二叉查找樹的中序遍歷結點列表 */public List<TreeNode> inOrderTraverseList() {if (nodelist != null) {nodelist.clear();}inOrderTraverse(root);return nodelist;}/** * inOrderTraverse: 對給定二叉查找樹進行中序遍歷 *  * @param root *            給定二叉查找樹的根結點 */private void inOrderTraverse(TreeNode root) {if (root != null) {inOrderTraverse(root.leftChild);nodelist.add(root);inOrderTraverse(root.rightChild);}}/** * toStringOfOrderList: 獲取二叉查找樹中關鍵字的有序列表 *  * @return 二叉查找樹中關鍵字的有序列表 */public String toStringOfOrderList() {StringBuilder sbBuilder = new StringBuilder(" [ ");for (TreeNode p : inOrderTraverseList()) {sbBuilder.append(p.key);sbBuilder.append(" ");}sbBuilder.append("]");return sbBuilder.toString();}/** * 獲取該二叉查找樹的字符串表示 */public String toString() {StringBuilder sbBuilder = new StringBuilder(" [ ");for (TreeNode p : inOrderTraverseList()) {sbBuilder.append(p);sbBuilder.append(" ");}sbBuilder.append("]");return sbBuilder.toString();}public TreeNode getRoot() {return root;}public static void testNode(BinarySearchTree bst, TreeNode pNode)throws Exception {System.out.println("本結點: " + pNode);System.out.println("前趨結點: " + bst.precessor(pNode));System.out.println("后繼結點: " + bst.successor(pNode));}public static void testTraverse(BinarySearchTree bst) {System.out.println("二叉樹遍歷:" + bst);System.out.println("二叉查找樹轉換為有序列表: " + bst.toStringOfOrderList());}public static void main(String[] args) {try {BinarySearchTree bst = new BinarySearchTree();System.out.println("查找樹是否為空? " + (bst.isEmpty() ? "是" : "否"));int[] keys = new int[] { 15, 6, 18, 3, 7, 13, 20, 2, 9, 4 };for (int key : keys) {bst.insert(key);}System.out.println("查找樹是否為空? " + (bst.isEmpty() ? "是" : "否"));TreeNode minkeyNode = bst.minElemNode(bst.getRoot());System.out.println("最小關鍵字: " + minkeyNode.getKey());testNode(bst, minkeyNode);TreeNode maxKeyNode = bst.maxElemNode(bst.getRoot());System.out.println("最大關鍵字: " + maxKeyNode.getKey());testNode(bst, maxKeyNode);System.out.println("根結點關鍵字: " + bst.getRoot().getKey());testNode(bst, bst.getRoot());testTraverse(bst);System.out.println("****************************** ");testTraverse(bst);} catch (Exception e) {System.out.println(e.getMessage());e.printStackTrace();}}}  

  


上一篇:java內存泄漏

下一篇:Oracle數據庫編程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美肥婆姓交大片| 久久久久久久亚洲精品| 中文字幕日韩欧美精品在线观看| 久久九九全国免费精品观看| 精品视频在线播放色网色视频| 91夜夜揉人人捏人人添红杏| 亚洲自拍中文字幕| 久久久精品999| 自拍偷拍亚洲一区| 日韩福利在线播放| 欧美精品一本久久男人的天堂| 国产精品午夜一区二区欲梦| 国产精品人人做人人爽| 亚洲无限乱码一二三四麻| 欧美日韩在线看| 国内精品视频在线| 国产91精品久久久久久久| 久久人体大胆视频| 欧美另类交人妖| 久久久久久午夜| 亚洲精品成人久久| 精品网站999www| 精品成人av一区| 亚洲精品女av网站| 青青草国产精品一区二区| 日韩激情av在线免费观看| 精品无码久久久久久国产| 精品伊人久久97| 亚洲成人网在线| 亚洲综合精品一区二区| 国产精品久久久久久久久免费| 亚洲国产精品久久91精品| 国产亚洲综合久久| www.久久草.com| 中文字幕国产精品| 国产一区二区视频在线观看| 欧洲一区二区视频| 91久久久久久久久久| 欧美日韩国产麻豆| 国产精品自拍视频| 亚洲精品av在线播放| 国产日韩精品入口| 国产精品免费网站| 在线观看久久av| 欧美刺激性大交免费视频| 亚洲精品第一国产综合精品| 欧美国产日韩一区二区在线观看| 亚洲自拍偷拍网址| 97精品欧美一区二区三区| 久久久精品国产亚洲| 久久躁日日躁aaaaxxxx| 日韩视频免费看| 日韩欧美国产成人| 91成品人片a无限观看| 97香蕉久久夜色精品国产| 自拍偷拍免费精品| 日韩av在线资源| 91在线无精精品一区二区| 久久久精品免费视频| 日韩中文字幕免费看| 日韩视频在线观看免费| 国产精品久久中文| 91亚洲国产精品| 日本精品视频在线| 国产福利视频一区二区| 久久久久久久久电影| 少妇av一区二区三区| 国产免费一区二区三区香蕉精| 久久久久久高潮国产精品视| 欧美国产一区二区三区| 亚洲天堂精品在线| 国产成人精品一区二区三区| 亚洲在线观看视频| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品观看在线亚洲人成网| 亚洲一区二区三区视频| 大荫蒂欧美视频另类xxxx| 亚洲视频综合网| 精品美女久久久久久免费| 国产精品高潮呻吟视频| 欧洲s码亚洲m码精品一区| 国产精品嫩草影院久久久| 亚洲最大福利网| 欧美日韩午夜视频在线观看| 粗暴蹂躏中文一区二区三区| 精品成人乱色一区二区| 久久天天躁夜夜躁狠狠躁2022| 成人激情电影一区二区| 国产精品视频白浆免费视频| 久久精品国产久精国产思思| 亚洲人成绝费网站色www| 日韩电影在线观看免费| 91亚洲va在线va天堂va国| 麻豆国产va免费精品高清在线| 国产一区二区三区视频| 久久精品国产99国产精品澳门| 欧美国产日韩免费| 国产成人精品午夜| 成人福利网站在线观看11| 91精品国产免费久久久久久| 91亚洲精品在线| 另类图片亚洲另类| 日韩免费在线视频| 欧美日韩性视频| 亚洲自拍在线观看| 日本aⅴ大伊香蕉精品视频| 欧美精品精品精品精品免费| 亚洲国产精品电影在线观看| 这里精品视频免费| 欧美电影免费观看电视剧大全| 国产精品自在线| 亚洲а∨天堂久久精品喷水| 欧美成人sm免费视频| 国产精品视频内| 国产免费一区二区三区在线观看| 国产精品第一第二| 欧美亚洲国产日本| 欧美在线观看网站| 日本不卡高字幕在线2019| 亚洲网址你懂得| 亚洲xxxxx电影| 国内精品久久久久久影视8| 国产成人91久久精品| 欧美美最猛性xxxxxx| 伊人久久精品视频| 亚洲自拍欧美色图| 亚洲国产欧美一区二区丝袜黑人| 欧美性猛交视频| 日本欧美国产在线| 国产精品对白刺激| 伦伦影院午夜日韩欧美限制| 欧美电影免费观看电视剧大全| 久久97久久97精品免视看| 视频在线一区二区| 精品国产一区二区三区久久狼5月| 国产欧美中文字幕| 欧美日韩激情视频8区| 成人a在线观看| 精品美女国产在线| 92国产精品久久久久首页| 成人在线中文字幕| 日韩精品一区二区三区第95| 日韩高清不卡av| 国产一区二区三区久久精品| 欧美亚洲另类制服自拍| 亚洲精品国产免费| 亚洲曰本av电影| 激情成人中文字幕| 欧美电影免费观看高清| 海角国产乱辈乱精品视频| 庆余年2免费日韩剧观看大牛| 国产成人一区二区在线| 欧美亚洲国产精品| 日韩欧美在线国产| 91精品国产综合久久香蕉| 中文字幕精品影院| 成人精品一区二区三区电影黑人| 91人人爽人人爽人人精88v| 久久精品2019中文字幕| 国产精品视频久久久久| 91日韩在线视频| 97视频在线看| 亚洲黄页视频免费观看| 亚洲一区中文字幕在线观看|