//二叉樹系統 public class BinarySystem { public static void main(String[] args) { BinaryDomain root = null; //定義頭結點 new BinaryAction().manage(root); } }
public class BinaryDomain { private int value; //二叉樹值 BinaryDomain left; //左結點 BinaryDomain right; //右結點 public int getValue() { return value; } public void setValue(int value) { this.value = value; } public BinaryDomain() { super(); // TODO Auto-generated constructor stub } public BinaryDomain(int value) { super(); this.value = value; } }
public interface BinaryBean { public void manage(BinaryDomain root); //二叉樹管理 public BinaryDomain add(BinaryDomain root); //二叉樹增長 public BinaryDomain delete(BinaryDomain root); //二叉樹刪除 public void query(BinaryDomain root); //二叉樹查詢 public void update(BinaryDomain root); //二叉樹修改 }
import java.util.Scanner; public class BinaryAction implements BinaryBean{ private Scanner input = new Scanner(System.in); @Override public void manage(BinaryDomain root) { while (true) { System.out.println("①增長 ②刪除 ③查詢 ④修改 ⑤返回"); int select = input.nextInt(); if (select == 1) { root = add(root); } else if (select == 2) { root = delete(root); } else if (select == 3) { query(root); } else if (select == 4) { update(root); } else { break; } } } //增長 @Override public BinaryDomain add(BinaryDomain root) { System.out.println("請輸入須要增長的值: "); int value = input.nextInt(); if (value < 0) { System.out.println("輸入的值不合法"); } else { BinaryDomain binary = new BinaryDomain(value); //將值存入對象 if (root == null) { //頭爲空 root = binary; //將值給頭 System.out.println("二叉樹的頭結點增長成功"); } else { BinaryDomain temp = root; //將頭保護起來 while (temp != null) { //小左大右 if (binary.getValue() > temp.getValue()) { //要增長的值大於當前頭的值 if (temp.right == null) { temp.right = binary; System.out.println("添加右子樹值成功"); break; } else { temp = temp.right; } } else if (binary.getValue() < temp.getValue()){ //要增長的值小於當前頭的值 if (temp.left == null) { temp.left = binary; System.out.println("添加左子樹值成功"); break; } else { temp = temp.left; } } else { //要增長的值等於當前頭的值 System.out.println("要增長的數值已存在,增長數據失敗"); break; } } } } return root; } //刪除 @Override public BinaryDomain delete(BinaryDomain root) { BinaryDomain temp = root; //保護頭結點 BinaryDomain tempPre = null; //要刪除的前一個結點 BinaryDomain del = null; //記錄要刪除的結點 System.out.println("請輸入須要刪除的值: "); int value = input.nextInt(); while (temp != null) { if (temp.getValue() == value) { //當前結點值 == 要刪除的值 del = temp; //記錄要刪除的結點 break; } else if (temp.getValue() > value) { //當前結點值 > 要刪除的值 往左移至下一個 tempPre = temp; //記錄要刪除結點的前一個結點 temp = temp.left; } else { //當前結點值 < 要刪除的值 往右移至下一個 tempPre = temp; temp = temp.right; } } //判斷要刪除的結點是否爲頭結點 if (del != null && tempPre == null) { System.out.println("要刪除的爲頭結點"); if (del.left == null && del.right == null) { //頭結點 無左無右 root = null; System.out.println("刪除 無左無右 頭結點成功"); } else if (del.left != null && del.right == null) { //要刪除的頭結點 有左無右 root = del.left; System.out.println("刪除 有左無右 頭結點成功"); } else if (del.left == null && del.right != null) { //要刪除的頭結點 無左有右 root = del.right; System.out.println("刪除 無左有右 頭結點成功"); } else { //要刪除的頭結點 有左有右 System.out.println("要刪除的頭結點有左有右: ①上移左邊的最右邊結點值 ②上移右邊的最左邊結點值"); int option = input.nextInt(); if (option == 1) { //移左邊的最右邊結點的值 BinaryDomain delLeft = del.left; //用一個對象指向要刪除結點的左邊 if (delLeft.right == null && delLeft.left == null) { //若是要刪除的結點的左邊結點沒有子結點,則把要刪除的結點值等於delLeft值,須要刪除結點的左結點爲空 del.setValue(delLeft.getValue()); del.left = null; System.out.println("刪除 有左有右 頭結點成功,頭結點的左子樹下 無子樹"); } else if (delLeft.right == null && delLeft.left != null) { //要刪除的結點的左邊結點 有左子樹無右子樹 del.setValue(delLeft.getValue()); del.left = delLeft.left; System.out.println("刪除 有左有右 頭結點成功,頭結點的左子樹下 有左子樹無右子樹"); } else { //要刪除的結點的左邊結點有右子樹 BinaryDomain movePre = null; //記錄刪除結點左邊結點的須要移走的最右邊的結點的父結點 while (delLeft.right != null) { movePre = delLeft; delLeft = delLeft.right; } del.setValue(delLeft.getValue()); movePre.right = delLeft.left; System.out.println("刪除 有左有右 頭結點成功,頭結點的左子樹下 有右子樹 須要移動"); } } else { //移右邊的最左邊結點值 BinaryDomain delRight = del.right; //用一個對象指向要刪除結點的右邊 if (delRight.right == null && delRight.left == null) { //若是要刪除的結點的右邊結點沒有子結點,則把要刪除的結點值等於delRight值,須要刪除結點的右結點爲空 del.setValue(delRight.getValue()); del.right = null; System.out.println("刪除 有左有右 頭結點成功,頭結點的右子樹下 無子樹"); } else if (delRight.right != null && delRight.left == null) { //要刪除的結點的右邊結點 有右子樹無左子樹 del.setValue(delRight.getValue()); del.right = delRight.right; System.out.println("刪除 有左有右 頭結點成功,頭結點的右子樹下 有右子樹無左子樹"); } else { //要刪除的結點的右邊結點有左子樹 BinaryDomain movePre = null; //記錄刪除結點右邊結點的須要移走的最左邊的結點的父結點 while (delRight.left != null) { movePre = delRight; delRight = delRight.left; System.out.println("刪除 有左有右 頭結點成功,頭結點的右子樹下 有左子樹 須要移動"); } } } } } else { //要刪除的不是頭結點 if (del.left == null && del.right == null) { //要刪除的結點無左無右 爲葉子結點 System.out.println("須要刪除的爲葉子結點"); if (del.getValue() > tempPre.getValue()) { //要刪除的值大於父結點的值 刪除的爲右葉子結點 tempPre.right = null; System.out.println("刪除非根結點下的右葉子結點成功"); } else { //要刪除的值小於父結點的值 刪除的爲左葉子結點 temp.left = null; System.out.println("刪除非根結點下的左葉子結點成功"); } } else if (del.left == null && del.right != null) { //要刪除的結點無左有右 if (del.getValue() > tempPre.getValue()) { //要刪除的值大於父結點的值 要刪除的爲父結點下的右子樹 tempPre.right = del.right; System.out.println("刪除非根結點下的右子樹成功,且該右子樹下 有右子樹無左子樹"); } else { //要刪除的值小於父結點的值 要刪除的爲父結點下的左子樹 tempPre.left = del.right; System.out.println("刪除非根結點下的左子樹成功,且該左子樹下 有右子樹無左子樹"); } } else if (del.left != null && del.right == null) { //要刪除的結點有左無右 if (del.getValue() > tempPre.getValue()) { //要刪除的值大於父結點的值 要刪除的爲父結點下的右子樹 tempPre.right = del.left; System.out.println("刪除非根結點下的右子樹成功,且該右子樹下 有左子樹無右子樹"); } else { //要刪除的值小於父結點的值 要刪除的爲父結點下的左子樹 tempPre.left = del.left; System.out.println("刪除非根結點下的左子樹成功,且該左子樹下 有左子樹無右子樹"); } }else { //要刪除的結點有左有右 System.out.println("要刪除的結點有左有右: ①上移左邊的最右邊結點值 ②上移右邊的最左邊結點值"); int option = input.nextInt(); if (option == 1) { //移左邊的最右邊結點 BinaryDomain delLeft = del.left; //定義對象指向要刪除結點的左邊結點 if (delLeft.right == null && delLeft.left == null) { //要刪除結點的左邊結點 無左子樹無右子樹 del.setValue(delLeft.getValue()); del.left = null; System.out.println("刪除非根結點下左子樹成功,且該左子樹下 無左子樹無右子樹"); } else if (delLeft.right == null && delLeft.left != null) { //要刪除結點的左邊結點 有左子樹無右子樹 del.setValue(delLeft.getValue()); del.left = delLeft.left; System.out.println("刪除非根結點下左子樹成功,且該左子樹下 有左子樹無右子樹"); } else { //要刪除結點的左邊結點 無左子樹有右子樹 BinaryDomain movePre = null; //記錄刪除結點左邊結點的須要移走的最右邊的結點的父結點 while (delLeft.right != null) { movePre = delLeft; delLeft = delLeft.right; } del.setValue(delLeft.getValue()); movePre.right = delLeft.left; System.out.println("刪除非根結點下左子樹成功,且該左子樹下 有右子樹 須要移動"); } } else { //移右邊的最左邊結點 BinaryDomain delRight = del.right; //定義對象指向要刪除結點的右結點 if (delRight.right == null && delRight.left == null) { //要刪除結點的右子樹下無子樹 del.setValue(delRight.getValue()); del.right = null; System.out.println("刪除非根結點下右子樹成功,且該右子樹下 無子樹"); } else if (delRight.right != null && delRight.left == null) { //要刪除結點的右子樹下有右子樹無左子樹 del.setValue(delRight.getValue()); del.right = delRight.right; System.out.println("刪除非根結點下右子樹成功,且該右子樹下 無左子樹有右子樹"); } else { //要刪除結點的右子樹下有左子樹 BinaryDomain movePre = null; //記錄刪除結點右邊結點的須要移走的最左邊的結點的父結點 while (delRight.left != null) { movePre = delRight; delRight = delRight.left; } del.setValue(delRight.getValue()); movePre.left = del.right; System.out.println("刪除非根結點下右子樹成功,且該右子樹下 有左子樹 須要移動"); } } } } return root; } //查詢 @Override public void query(BinaryDomain root) { System.out.println("①先序查詢 ②中序查詢 ③後序查詢"); int select = input.nextInt(); if (select == 1) { //先序查詢 根 左 右 preorder(root); } else if (select == 2) { //中序查詢 左 根 右 inorder(root); } else { //後序查詢 左 右 根 epilogue(root); } } //先序查詢 根 左 右 public void preorder(BinaryDomain root) { BinaryDomain temp = root; if (temp != null) { System.out.println("先序查詢爲: "+temp.getValue()); //根 preorder(temp.left); //左 preorder(temp.right); //右 } } //中序查詢 左 根 右 public void inorder (BinaryDomain root) { BinaryDomain temp = root; if (temp != null) { inorder(temp.left); //左 System.out.println("中序查詢爲: "+temp.getValue()); //根 inorder(temp.right); //右 } } //後序查詢 左 右 根 public void epilogue (BinaryDomain root) { BinaryDomain temp = root; if (temp != null) { epilogue (temp.left); //左 epilogue (temp.right); //右 System.out.println("後序查詢爲: "+temp.getValue()); //根 } } //修改 @Override public void update(BinaryDomain root) { System.out.println("請輸入須要修改的數據元素: "); int update = input.nextInt(); } }
修改沒寫了 ,很麻煩 ,若有須要留言,告訴你具體實現思路。。