生活随笔
收集整理的這篇文章主要介紹了
二叉查找树的Java实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)自:http://blog.csdn.net/lovesqcc/article/details/6246615
為了克服對樹結(jié)構(gòu)編程的恐懼感,決心自己實現(xiàn)一遍二叉查找樹,以便掌握關(guān)于樹結(jié)構(gòu)編程的一些技巧和方法。以下是基本思路:
?
??????? [1] 關(guān)于容器與封裝。封裝,是一種非常重要的系統(tǒng)設(shè)計思想;無論是面向過程的函數(shù),還是面向?qū)ο蟮膶ο?#xff0c;都是實現(xiàn)抽象和封裝的技術(shù)手段。要使系統(tǒng)更加安全更具可維護性,就應(yīng)當將封裝思想謹記心中。容器是封裝思想的絕好示例。用戶對容器的印象應(yīng)該簡潔地表達為:A. 可以存入指定的東西; B. 可以取出所期望的東西。 而至于這容器中究竟有什么機關(guān),藏的是毒蛇還是黃金,都是對用戶不可見的。二叉查找樹就是這樣一個容器。面向?qū)ο缶幊讨?#xff0c;為實現(xiàn)樹結(jié)構(gòu),自然要對樹結(jié)點對象進行建模。這里采用了內(nèi)部類;外部類對二叉查找樹進行建模,而樹結(jié)點作為內(nèi)部類實現(xiàn)。
?
?????? [2] 本程序盡量實現(xiàn)一個比較實用的二叉查找樹,其中包括動態(tài)的插入、刪除操作;查詢給定關(guān)鍵字、最小關(guān)鍵字、最大關(guān)鍵字;獲取二叉樹的有序列表(用于排序)等。因為我希望以后還能用到這個容器的,而不僅僅是編程練習(xí)。二叉查找樹操作的大部分算法參考了《算法導(dǎo)論2》第12章內(nèi)容,刪除操作略顯笨拙。程序中有錯誤之處,歡迎指出。
?
????? [3]? 程序如下:
?
?????
[c-sharp]?view plaincopyprint?
?????????package?datastructure.tree;??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?+?")";??????????}????????????????}?????????????????????public?boolean?isEmpty()??????{??????????if?(root?==?null)?{??????????????return?true;??????????}?else?{??????????????return?false;??????????}?????????????????}????????????????????public?void?TreeEmpty()?throws?Exception???????{??????????if?(isEmpty())?{??????????????throw?new?Exception("樹為空!");??????????}??????}??????????????????????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;??????}??????????????????????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;??????}??????????????????????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;??????}???????????????????????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;??????}?????????????????????????????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;??????}???????????????????????????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;??????????}???????????????????????}?????????????????????public?void?delete(int?key)?throws?Exception??????{??????????TreeNode?pNode?=?search(key);??????????if?(pNode?==?null)?{??????????????throw?new?Exception("樹中不存在要刪除的關(guān)鍵字!");??????????}??????????delete(pNode);??????}????????????????????????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;??????}?????????????????????public?List<TreeNode>?inOrderTraverseList()??????{??????????if?(nodelist?!=?null)?{?????????????nodelist.clear();??????????}??????????inOrderTraverse(root);??????????return?nodelist;??????}?????????????????????private?void?inOrderTraverse(TreeNode?root)??????{??????????if?(root?!=?null)?{??????????????inOrderTraverse(root.leftChild);??????????????nodelist.add(root);??????????????inOrderTraverse(root.rightChild);??????????}??????}?????????????????????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("本結(jié)點:?"?+?pNode);??????????System.out.println("前趨結(jié)點:?"?+?bst.precessor(pNode));??????????System.out.println("后繼結(jié)點:?"?+?bst.successor(pNode));??????}????????????public?static?void?testTraverse(BinarySearchTree?bst)?{??????????System.out.println("二叉樹遍歷:"?+?bst);??????????System.out.println("二叉查找樹轉(zhuǎn)換為有序列表:?"?+?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("最小關(guān)鍵字:?"?+?minkeyNode.getKey());??????????????testNode(bst,?minkeyNode);????????????????????????????TreeNode?maxKeyNode?=?bst.maxElemNode(bst.getRoot());??????????????System.out.println("最大關(guān)鍵字:?"?+?maxKeyNode.getKey());??????????????testNode(bst,?maxKeyNode);????????????????????????????System.out.println("根結(jié)點關(guān)鍵字:?"?+?bst.getRoot().getKey());??????????????testNode(bst,?bst.getRoot());??????????????testTraverse(bst);????????????????????????????System.out.println("******************************?");????????????????????????????System.out.println("查找?7?:?"?+?(bst.search(7)?!=?null???"查找成功!"?:?"查找失敗,不存在該關(guān)鍵字!"));??????????????bst.delete(7);??????????????System.out.println("查找?7?:?"?+?(bst.search(7)?!=?null???"查找成功!"?:?"查找失敗,不存在該關(guān)鍵字!"));??????????????System.out.println("查找?12?:?"?+?(bst.search(12)?!=?null???"查找成功!"?:?"查找失敗,不存在該關(guān)鍵字!"));??????????????bst.insert(12);??????????????System.out.println("查找?12?:?"?+?(bst.search(12)?!=?null???"查找成功!"?:?"查找失敗,不存在該關(guān)鍵字!"));????????????????????????????testTraverse(bst);????????????????????????????System.out.println("******************************?");????????????????????????????bst.insert(16);??????????????bst.delete(6);??????????????bst.delete(4);????????????????????????????testTraverse(bst);????????????????????????}?catch?(Exception?e)?{??????????????System.out.println(e.getMessage());??????????????e.printStackTrace();??????????}??????}??????????????} ?? ?
轉(zhuǎn)載于:https://www.cnblogs.com/cugwx/p/3664306.html
總結(jié)
以上是生活随笔為你收集整理的二叉查找树的Java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。