Java數據結構——二叉樹 增長、刪除、查詢

//二叉樹系統
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();
	}
}
 
修改沒寫了 ,很麻煩 ,若有須要留言,告訴你具體實現思路。。
相關文章
相關標籤/搜索