目录
二叉搜索树又称为二叉排序树,它具有以下性质
1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3.它的左右子树也为二叉搜索树
以下就是一个二叉搜索树,每个节点的左节点小于父亲节的,右节点大于父亲节点。

- class Node{
- public int val;
- public Node left;
- public Node right;
- public Node(int val){
- this.val = val;
- }
- }
首先判断根节点是否为空,为空直接添加,不为空的话就利用“每个节点的左节点小于父亲节的,右节点大于父亲节点”这个特点进行判断,并进行插入。
- public boolean insert(int v){
- if(root == null){
- root = new Node(v);
- return true;
- }
- Node parent = null;
- Node cur = root;
- while(cur != null){
- if(cur.val > v){
- parent = cur;
- cur = cur.left;
- }else if (cur.val == v){
- return false;//不能有相同的数据
- }else {
- parent = cur;
- cur = cur.right;
- }
- }
- Node node = new Node(v);
- if(parent.val > v){
- parent.left = node;
- }else if(parent.val < v){
- parent.right = node;
- }
- return true;
- }
对于某个元素的查找,利用“每个节点的左节点小于父亲节的,右节点大于父亲节点”,进行判断,直至找到目标节点。
- public Node Serach(int v){
- Node cur = root;
- while(cur != null) {
- if (cur.val > v) {
- cur = cur.left;
- } else if (cur.val == v) {
- return cur;
- } else {
- cur = cur.right;
- }
- }
- return null;
- }
删除操作情况及其复杂。
- public void remove(int v){
- Node cur = root;
- Node parent = null;
- while(cur != null){
- if(cur.val == v){
- removeNode(cur,parent);
- break;
- }else if(cur.val > v){
- parent = cur;
- cur = cur.left;
- }else {
- parent = cur;
- cur = cur.right;
- }
-
- }
- }
- public void removeNode(Node cur,Node parent){
- if(cur.left == null){
- if(cur == root){
- root = cur.right;
- }else if(cur == parent.left){
- parent.left = cur.right;
- }else{
- parent.right = cur.right;
- }
- }else if(cur.right == null){
- if(cur == root){
- root = cur.left;
- }else if(cur == parent.left){
- parent.left = cur.left;
- }else {
- parent.right = cur.left;
- }
- }else {
- Node targetParent = cur;
- Node target = cur.right;
- while(target.left != null){
- targetParent = target;
- target = target.left;
-
- }
- cur.val = target.val;
- if(target == targetParent.left){
- targetParent.left = target.right;
- }else {
- targetParent.right = target.right;
- }
-
- }
- }
- //节点定义
- class Node{
- public int val;
- public Node left;
- public Node right;
- public Node(int val){
- this.val = val;
- }
- }
- public class BinarySearchTree {
- public Node root = null;
-
- //搜索操作
- public Node Serach(int v){
- Node cur = root;
- while(cur != null) {
- if (cur.val > v) {
- cur = cur.left;
- } else if (cur.val == v) {
- return cur;
- } else {
- cur = cur.right;
- }
- }
- return null;
- }
-
- //插入操作
- public boolean insert(int v){
- if(root == null){
- root = new Node(v);
- return true;
- }
- Node parent = null;
- Node cur = root;
- while(cur != null){
- if(cur.val > v){
- parent = cur;
- cur = cur.left;
- }else if (cur.val == v){
- return false;//不能有相同的数据
- }else {
- parent = cur;
- cur = cur.right;
- }
- }
- Node node = new Node(v);
- if(parent.val > v){
- parent.left = node;
- }else if(parent.val < v){
- parent.right = node;
- }
- return true;
- }
-
- //删除操作
- public void remove(int v){
- Node cur = root;
- Node parent = null;
- while(cur != null){
- if(cur.val == v){
- removeNode(cur,parent);
- break;
- }else if(cur.val > v){
- parent = cur;
- cur = cur.left;
- }else {
- parent = cur;
- cur = cur.right;
- }
-
- }
- }
-
- //删除操作的具体实现
- public void removeNode(Node cur,Node parent){
- if(cur.left == null){
- if(cur == root){
- root = cur.right;
- }else if(cur == parent.left){
- parent.left = cur.right;
- }else{
- parent.right = cur.right;
- }
- }else if(cur.right == null){
- if(cur == root){
- root = cur.left;
- }else if(cur == parent.left){
- parent.left = cur.left;
- }else {
- parent.right = cur.left;
- }
- }else {
- Node targetParent = cur;
- Node target = cur.right;
- while(target.left != null){
- targetParent = target;
- target = target.left;
-
- }
- cur.val = target.val;
- if(target == targetParent.left){
- targetParent.left = target.right;
- }else {
- targetParent.right = target.right;
- }
-
- }
- }
-
- //中序遍历
- public void inOrder(Node root){
- if(root == null) return;
- inOrder(root.left);
- System.out.print(root.val+" ");
- inOrder(root.right);
- }
- }
- public static void main(String[] args) {
- int[] array = {10,8,19,3,9,4,7};
- BinarySearchTree binarySearchTree = new BinarySearchTree();
- for (int i = 0;i < array.length;i++){
- binarySearchTree.insert(array[i]);
- }
- binarySearchTree.inOrder(binarySearchTree.root);
-
- System.out.println();
- Node node = binarySearchTree.Serach(8);
- System.out.println(node.val);
-
- binarySearchTree.insert(15);
- binarySearchTree.inOrder(binarySearchTree.root);
-
- System.out.println();
- binarySearchTree.remove(9);
- binarySearchTree.inOrder(binarySearchTree.root);
-
- }
运行结果:
