/** * 文件描述:手寫二叉搜索樹(左小右大的) * 作者:chenjingkun708 * 創建時間:2020/3/24 * 更改時間:2020/3/24 */ public class MyBinarySearchTree { public Node root;//樹的根節點 public MyBinarySearchTree() { } /* 前序遍歷,打印的順序依次是:根,左,右節點 */ public void frontTravesal(Node root){ if (root==null){ return; } Log.i("android_test", String.valueOf(root.value)); frontTravesal(root.left); frontTravesal(root.right); } /* 中須遍歷 */ public void centerTravesal(Node root){ if (root==null){ return; } centerTravesal(root.left); Log.i("android_test",String.valueOf(root.value)); centerTravesal(root.right); } /* 後序遍歷 */ public void lastTravesal(Node root){ if (root==null){ return; } lastTravesal(root.left); lastTravesal(root.right); Log.i("android_test",String.valueOf(root.value)); } //查找:利用特性:左小右大,遞歸 public boolean find(int target){ return find(root,target)==null?false:true; } private Node find(Node root,int target){ if (root==null){ return null; } if (root.value==target){ return root; } if (target<root.value){ return find(root.left,target); }else { return find(root.right,target); } } //刪除,因爲要涉及到移動,可採取一些辦法來實現。可能會有點問題 public boolean delete(int target){ Node node = find(root,target); if (node==null){ return false; } //1.向右查找最大的節點 Node maxNode = popReplace(node); //2. 把目標值用最大值代替 node.value = maxNode.value; //3.向下沉去糾正節點 shritDownNode(node); return true; } //下沉去糾正節點 private void shritDownNode(Node curNode) { if (curNode==null){ return; } if (curNode.left!=null&&curNode.value<curNode.left.value){ //交換節點 Node leftNode = curNode.left; Node tempNode = leftNode; leftNode.value = curNode.value; leftNode.left = curNode.left; leftNode.right = curNode.right; curNode.value = tempNode.value; curNode.left = tempNode.left; curNode.right = tempNode.right; shritDownNode(curNode); }else if (curNode.right!=null&&curNode.value>curNode.right.value){ //交換節點 Node rightNode = curNode.right; Node tempNode = rightNode; rightNode.value = curNode.value; rightNode.left = curNode.left; rightNode.right = curNode.right; curNode.value = tempNode.value; curNode.left = tempNode.left; curNode.right = tempNode.right; shritDownNode(curNode); } return; } //彈出最右邊的右節點或左節點 private Node popReplace(Node root){ if (root.right==null){ return root; } Node maxNode = popReplace(root.right); if (maxNode.left!=null){ Node leftNode = maxNode.left; maxNode.left = null; return leftNode; }else { root.right = null; return maxNode; } } //插入值 public void add(int value){ addNode(value,root); } //採用遞歸的方式 private Node addNode(int value,Node curNode){ if (curNode==null){ return new Node(value,null,null); } if (value<curNode.value){ curNode.left = addNode(value,curNode.left); }else if (value>curNode.value){ curNode.right = addNode(value,curNode.right); }else{ curNode.value = value; } return curNode; } //判斷是不是自平衡的搜索二叉樹:左右子樹的高度不超過1,並且子樹也是一個平衡二叉樹 public boolean isBalanceTree(Node node){ if (node==null){ return true; } int leftDep = getTreeDeep(node.left); int rightDep = getTreeDeep(node.right); return Math.abs(leftDep-rightDep)<=1&&isBalanceTree(node.left)&&isBalanceTree(node.right); } //獲取樹或子樹的深度 public int getTreeDeep(Node childRoot) { if (childRoot==null){ return 0; } int leftDep,rightDep; leftDep = getTreeDeep(childRoot.left)+1; rightDep = getTreeDeep(childRoot.right)+1; return leftDep>rightDep?leftDep:rightDep; } /* 樹節點類表示 */ public static class Node{ int value; //左孩子 public Node left; //右孩子 public Node right; public Node(int value, Node left, Node right) { this.value = value; this.left = left; this.right = right; } } }
搜索二叉樹的手寫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.