Java版二叉树遍历,查找,顺序化存储代码实现
生活随笔
收集整理的這篇文章主要介紹了
Java版二叉树遍历,查找,顺序化存储代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前中后序遍歷,查找
package Tree; /*** 二叉樹前 中 后 遍歷,查找* @author bai**/ public class BinaryTreeDemo {public static void main(String[] args) {//先需要創建一顆二叉樹BinaryTree binaryTree = new BinaryTree();//創建需要的節點HeroNode root = new HeroNode(1, "鋼鐵俠");HeroNode node1 = new HeroNode(2, "無敵浩克");HeroNode node2 = new HeroNode(3, "美國隊長");HeroNode node3 = new HeroNode(4, "戰爭機器");HeroNode node4 = new HeroNode(5, "蜘蛛俠");//說明:先手動創建二叉樹,后面學習用遞歸的方法調用root.setLeft(node1);root.setRight(node2);node2.setRight(node3);node2.setLeft(node4);binaryTree.setRoot(root);//測試System.out.println("前序遍歷測試");binaryTree.preOrder();System.out.println("中序遍歷測試");binaryTree.infixOrder();System.out.println("后序遍歷測試");binaryTree.postOrder();//前序查找測試System.out.println("前序查找");HeroNode resNode = binaryTree.preOrderSearch(5);if(resNode!=null){System.out.println(resNode);}else{System.out.println("null");}//中序查找測試System.out.println("中序查找");resNode = binaryTree.infixOrderSearch(3);if(resNode!=null){System.out.println(resNode);}else{System.out.println("null");}//后序查找遍歷System.out.println("后序查找");resNode = binaryTree.postOrderSearch(2);if(resNode!=null){System.out.println(resNode);}else{System.out.println("null");}//刪除測試System.out.println("刪除前,前序遍歷");binaryTree.preOrder();binaryTree.delNode(3);System.out.println("刪除后,前序遍歷");binaryTree.preOrder();} } //定義一個BinaryTree 二叉數 class BinaryTree{private HeroNode root;public void setRoot(HeroNode root){this.root = root;}//刪除結點public void delNode(int no){if(root!=null){if(root.getNo()==no){root = null;}else{root.delNode(no);}}else{System.out.println("空樹,不能刪除");}}//前序遍歷public void preOrder(){if(this.root!=null){this.root.preOrder();}else{System.out.println("二叉樹為空,無法遍歷");}}//中序遍歷public void infixOrder(){if(this.root!=null){this.root.infixOrder();}else{System.out.println("二叉樹為空,無法遍歷");}}//后序遍歷public void postOrder(){if(this.root!=null){this.root.postOrder();}else{System.out.println("二叉樹為空,無法遍歷");}}//前序查找public HeroNode preOrderSearch(int no){if(root!=null){return root.preOrderseach(no);}else{return null;}}//中序查找public HeroNode infixOrderSearch(int no){if(root!=null){return root.infixOrderSearch(no);}else{return null;}}//后序查找public HeroNode postOrderSearch(int no){if(root!=null){return root.postOrderSearch(no);}else{return null;}} } //先創建HeroNode結點 class HeroNode{private int no;private String name;private HeroNode left;private HeroNode right;public HeroNode(int no, String name) {super();this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public HeroNode getLeft() {return left;}public void setLeft(HeroNode left) {this.left = left;}public HeroNode getRight() {return right;}public void setRight(HeroNode right) {this.right = right;}@Overridepublic String toString() {return "HeroNode [no=" + no + ", name=" + name + "]";}//遞歸刪除節點//1 如果刪除的節點是葉子節點,則刪除該節點//2 如果刪除的節點是非葉子節點,則刪除該子樹public void delNode(int no){//思路/** 1 因為二叉樹是單向的,所以我們是判斷當前結點是否需要刪除結點* 2如果當前節點的左子結點不為空,并且左子結點,就是要刪除結點,就將this.left=null,并且就返回* 3如果當前結點的右子節點不為空,并且右子結點,就是要刪除結點,就將this.right = null,并且返回* 4如果第2 3 步沒有刪除結點,那么我們就需要向左子樹進行遞歸刪除* 5 如果第4 步也沒有刪除結點,則應當向右子樹進行遞歸刪除*///如果當前結點的左子節點不為空,并且左子結點就是要刪除結點,就將this.left=nullif(this.left!=null&&this.left.no==no){this.left = null;return;}//如果當前結點的右子節點不為空,并且右子結點就是要刪除結點,就將this.right=nullif(this.right!=null&&this.right.no==no){this.right=null;return;}//左子樹遞歸刪除if(this.left!=null){this.left.delNode(no);}//右子樹遞歸刪除if(this.right!=null){this.right.delNode(no);}}//編寫前序遍歷的方法public void preOrder(){System.out.println(this);//先輸出父節點//遞歸向左子樹前序遍歷if(this.left!=null){this.left.preOrder();}//遞歸向右子樹前序遍歷if(this.right!=null){this.right.preOrder();}}//中序遍歷public void infixOrder(){//遞歸向左子樹中序遍歷if(this.left!=null){this.left.infixOrder();}//輸出父節點System.out.println(this);//遞歸向右子樹中序遍歷if(this.right!=null){this.right.infixOrder();}}//后序遍歷public void postOrder(){//遞歸向左子樹遍歷if(this.left!=null){this.left.postOrder();}//遞歸向右子樹遍歷if(this.right!=null){this.right.postOrder();}//輸出父節點System.out.println(this);}//前序遍歷查找/*** @param no 查找no* @return 如果查找到就返回node 如果沒有找到就返回null*/public HeroNode preOrderseach(int no){//比較當前節點if(this.no == no){return this;}//1 判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找//2 如果左遞歸前序查找,找到節點,則返回HeroNode resNode = null;if(this.left!=null){resNode = this.left.preOrderseach(no);}if(resNode!=null){return resNode;}//1 左遞歸前序查找,找到節點,則返回,否繼續判斷//2 當前節點的右子節點是否為空,如果不空,則繼續向右遞歸前序查找if(this.right !=null){resNode = this.right.preOrderseach(no);}return resNode;}//中序遍歷查找public HeroNode infixOrderSearch(int no){//判斷當前節點的左字節點是否為空,如果不為空,則遞歸中序查找HeroNode resNode = null;if(this.left!=null){resNode = this.left.infixOrderSearch(no);}if(resNode!=null){return resNode;}//如果找到,則返回,如果沒有找到,就跟當前節點比較,如果是則是返回當前節點if(this.no == no){return this;}//右遞歸中序查找if(this.right!=null){resNode = this.right.infixOrderSearch(no);}return resNode;}//后序遍歷public HeroNode postOrderSearch(int no){//先判斷左子節點有無查找到HeroNode resNode = null;if(this.left!=null){resNode = this.left.postOrderSearch(no);}if(resNode!=null){return resNode;}//右子節點查找if(this.right!=null){resNode = this.right.postOrderSearch(no);}if(resNode!=null){return resNode;}//判斷當前節點if(this.no == no){return this;}return resNode;} }順序存儲
package Tree; /** 順序化存儲*/ public class ArrBinaryTreeDemo {public static void main(String[] args) {int[] arr ={1,2,3,4,5,6,7};ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);arrBinaryTree.preOrder();} } class ArrBinaryTree{private int[] arr;//存儲數據結點的數組public ArrBinaryTree(int[] arr) {super();this.arr = arr;}//重載preOrderpublic void preOrder(){this.preOrder(0);}//編寫一個方法,完成順序存儲二叉樹的前序遍歷public void preOrder(int index){if(arr==null||arr.length==0){System.out.println("數組為空");}//輸出當前這個元素System.out.println(arr[index]);if((index*2+1)<arr.length){preOrder(2*index+1);}if((index*2+2)<arr.length){preOrder(index*2+2);}}//編寫一個方法,完成順序存儲二叉樹的中序遍歷public void infixOrder(int index){if(arr==null&&arr.length==0){System.out.println("數組為空");}if((index*2+1)<arr.length){infixOrder(2*index+1);}System.out.println(arr[index]);if((index*2+2)<arr.length){infixOrder(index*2+2);}}//順序存儲二叉樹的后序遍歷public void postOrder(int index){if(arr==null&&arr.length==0){System.out.println("數組為空");}if((index*2+1)<arr.length){infixOrder(2*index+1);}if((index*2+2)<arr.length){infixOrder(index*2+2);}System.out.println(arr[index]);}} 新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Java版二叉树遍历,查找,顺序化存储代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt 利用 HTML 生成PDF文档,不
- 下一篇: RN返回navigation方法