zoukankan      html  css  js  c++  java
  • java数据结构和算法------二叉排序树

      1 package iYou.neugle.search;
      2 
      3 public class BSTree_search {
      4     class BSTree {
      5         public int data;
      6         public BSTree left;
      7         public BSTree right;
      8     }
      9 
     10     public static void main(String[] args) {
     11         BSTree_search bst = new BSTree_search();
     12         int[] array = new int[] { 50, 30, 70, 10, 40, 90, 80 };
     13         BSTree bsTree = bst.CreateBSTree(array);
     14 
     15         bst.LDR_BST(bsTree);
     16 
     17         boolean bool = bst.SearchBSTree(bsTree, 10);
     18         System.out.println("10是否在二叉排序树中:" + bool);
     19 
     20         BSTree adjustBSTree = bst.DeleteBSTree(bsTree, 50);
     21         bst.LDR_BST(adjustBSTree);
     22     }
     23 
     24     // 创建二叉排序树
     25     public BSTree CreateBSTree(int[] array) {
     26         BSTree bsTree = null;
     27         for (int i = 0; i < array.length; i++) {
     28             if (bsTree == null) {
     29                 bsTree = new BSTree();
     30                 bsTree.data = array[i];
     31             } else {
     32                 this.InsertBSTree(bsTree, array[i]);
     33             }
     34         }
     35         return bsTree;
     36     }
     37 
     38     // 递归创建左右子树
     39     public void InsertBSTree(BSTree bsTree, int key) {
     40         if (bsTree.data > key) {
     41             if (bsTree.left == null) {
     42                 bsTree.left = new BSTree();
     43                 bsTree.left.data = key;
     44             } else {
     45                 InsertBSTree(bsTree.left, key);
     46             }
     47         } else {
     48             if (bsTree.right == null) {
     49                 bsTree.right = new BSTree();
     50                 bsTree.right.data = key;
     51             } else {
     52                 InsertBSTree(bsTree.right, key);
     53             }
     54         }
     55     }
     56 
     57     // 中序遍历(递归)
     58     public void LDR_BST(BSTree bsTree) {
     59         if (bsTree != null) {
     60             LDR_BST(bsTree.left);
     61             System.out.println(bsTree.data);
     62             LDR_BST(bsTree.right);
     63         }
     64     }
     65 
     66     // 在二叉排序树中查找元素是否存在
     67     public boolean SearchBSTree(BSTree bsTree, int key) {
     68         if (bsTree == null) {
     69             return false;
     70         }
     71         if (bsTree.data == key) {
     72             return true;
     73         }
     74         if (bsTree.data > key) {
     75             return SearchBSTree(bsTree.left, key);
     76         } else {
     77             return SearchBSTree(bsTree.right, key);
     78         }
     79     }
     80 
     81     // 删除二叉排序树中的节点
     82     public BSTree DeleteBSTree(BSTree bsTree, int key) {
     83         if (bsTree == null) {
     84             return null;
     85         }
     86 
     87         if (bsTree.data == key) {
     88             // 第一种情况:叶子节点
     89             if (bsTree.left == null && bsTree.right == null) {
     90                 bsTree = null;
     91             }
     92             // 第二种情况:节点有左子结点
     93             if (bsTree.left != null && bsTree.right == null) {
     94                 bsTree = bsTree.left;
     95             }
     96             // 第三种情况:节点有右子结点
     97             if (bsTree.left == null && bsTree.right != null) {
     98                 bsTree = bsTree.right;
     99             }
    100             // 第四种情况:节点既有左子结点又有右子结点
    101             if (bsTree.left != null && bsTree.right != null) {
    102                 BSTree temp = bsTree.right;
    103                 // 查找到右边节点中最左侧的节点
    104                 while (temp.left != null) {
    105                     temp = temp.left;
    106                 }
    107                 // 将左边节点赋给右边节点中最左侧的节点
    108                 temp.left = bsTree.left;
    109 
    110                 bsTree = bsTree.right;
    111             }
    112 
    113             return bsTree;
    114         }
    115 
    116         if (bsTree.data > key) {
    117             bsTree.left = DeleteBSTree(bsTree.left, key);
    118         } else {
    119             bsTree.right = DeleteBSTree(bsTree.right, key);
    120         }
    121 
    122         return bsTree;
    123     }
    124 }
  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1421 搬寝室
    HDU 1176 免费馅饼
    七种排序算法的实现和总结
    算法纲要
    UVa401 回文词
    UVa 10361 Automatic Poetry
    UVa 537 Artificial Intelligence?
    UVa 409 Excuses, Excuses!
    UVa 10878 Decode the tape
  • 原文地址:https://www.cnblogs.com/niuxiaoha/p/4628763.html
Copyright © 2011-2022 走看看