1. 程式人生 > >資料結構11--查詢

資料結構11--查詢

1.查詢的概念

查詢表是由同一型別的資料元素構成的集合,表中每個資料元素均由若干個資料項組成,每個資料項的值稱為該資料元素的關鍵字,其中可以唯一標識一個數據元素的關鍵字稱為主關鍵字,否則稱為次關鍵字。

線性表查詢:線性表查詢分為順序查詢演算法和折半查詢演算法

樹結構查詢

2.順序查詢演算法

  順序查詢的基本思想是,比較目標值與表中的每一個元素的值,如果某個元素的值與目標的值相等,則查詢成功,並返回該資料元素的位置,如果知道標為仍沒有佔到與目標值匹配的元素,則查詢失敗。

package com.wx.datastructure;

public class SequentialSearch {
    public static void main(String[] args)
    {
        int[] data={4,6,3,55,2,8};
        int  finddata=55;
        int len=data.length;
        for (int i=0;i<len;i++)
        {
            if (finddata==data[i])
            {
                System.out.println("查詢成功!");
                break;
            }
            if(i==(len-1))
            {
                System.out.println("查詢失敗!");
            }
        }
    }
}

3.折半查詢(線性表必須是有序序列)

  折半查詢,用指定的關鍵字與查詢表中間位置的資料元素的關鍵字做比較,如果二者相等,則查詢成功,否則以中間元素為界,將查詢表分為前後兩個部分,如果中間元素的關鍵字大於給定元素的關鍵字,則在前以字表進行折半查詢,否則在後一子表進行折半查詢,重複上述過程,直到出現匹配的資料元素,則查詢成功,反之,如果直到子表為空時仍未找到,則查詢失敗。

package com.wx.datastructure;

public class BinarySearch {
    public static void main(String[] args)
    {
        int[] data={3,6,7,14,26,32};
        int finddata=32;
        int low=0;
        int len=data.length;
        int high=len-1;
        while (low<=high)
        {
            //計算中間位
            int mid=(low+high)/2;
            if (data[mid]>finddata)
            {
                high=mid-1;
            }
            else if (data[mid]==finddata)
            {
                System.out.println("查詢成功下標位:"+mid);
                break;
            }
            else {
                low=mid+1;
            }

        }
    }
}

 4.二叉樹查詢 

二叉樹查詢:若它的左子樹非空,則左子樹上所有節點的值均小於根節點的值。

若他的右子樹非空,則右子樹上所有節點的值均大於根節點的值。

左右子樹本身又是一棵二叉查詢樹。

二叉樹查詢的性質:按中序遍歷二叉查詢樹,所得的中序遍歷序列是一個遞增有序序列

                           

 5.構造二叉查詢樹之插入演算法

   比較新節點關鍵字與各子樹根節點的大小關係,如果新節點關鍵字小,則遞迴進入相應根節點的左子樹,直到找到左子樹為空的位置,否則,遞迴進入相應根節點的右子樹,直到找到右子樹為空的位置。

    

  java程式碼實現二叉樹的新增,刪除元素二叉樹的歷遍實現在我之前的部落格中有,這次修改了部分程式碼,加入新增和刪除的操作,這裡還是把程式碼貼出來

 建立一個TreeNode類,他是樹的一個節點,包含了資料域,左指標域和右指標域

package com.wx.datastructure;
/*
  二叉樹的節點,包含資料域,左指標域和右指標域
 */
public class TreeNode {
    public int data;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data,TreeNode left,TreeNode right)
    {
        this.data=data;
        this.left=left;
        this.right=right;
    }
    public TreeNode(int value)
    {

        this(value,null,null);
    }
    public TreeNode()
    {
        this(0,null,null);
    }

}

 建立一個二叉樹類

package com.wx.datastructure;

import java.util.ArrayList;
import java.util.List;
/*
  構造一個二叉樹類.
 */
public class TwoForkedTree {
    private List<Integer> datalist=new ArrayList<Integer>();
    public TreeNode root;
    public TwoForkedTree()
    {
        root=null;
    }
    public TwoForkedTree(TreeNode node)
    {
        this.root=node;
    }
    //判斷二叉樹是否為空
    public boolean isEmpty()
    {
        if (root==null)
        {
            return true;
        }
        return false;
    }
    /*
     新增樹的節點,(事先是一棵有序的二叉樹)
     */
    private void addTree(TreeNode rootnode,int data)
    {
          if (rootnode.data>data)
          {     //插入左子樹
                if (rootnode.left==null)
                {
                    TreeNode node = new TreeNode(data);
                    rootnode.left=node;
                }else {
                    addTree( rootnode.left,data);
                }
          }
          else {
                //插入右子樹
              if (rootnode.right==null)
              {
                  TreeNode node=new TreeNode(data);
                  rootnode.right=node;
              }else {
                  addTree(rootnode.right,data);
              }
          }
    }

    /*
    往樹中新增元素
     */
    public void add(int data)
    {
        if (root==null)
        {
            TreeNode node=new TreeNode(data,null,null);
            root=node;
        }else
        {
            addTree(root,data);
        }
    }
    /*
    刪除一個節點,思路:歷遍拿到所有的節點,刪除後重新構造二叉樹
     */
    public void deleteTree(int deletedata)
    {
        if(root==null)
        {
            throw new NullPointerException("二叉樹為空");
        }
        else {
            loadData(root);
            if (!datalist.contains(deletedata))
            {
                throw new NullPointerException("刪除的元素不存在");
            }
            datalist.remove(new Integer(14));
            root=null;
            for (Integer data:datalist)
            {

                add(data);
            }
        }


    }

    /*
    中序遍歷
     */
   private void showTree(TreeNode root)
   {
       if (root.left!=null)
       {
           showTree(root.left);
       }
        System.out.print(root.data+" ");
       if (root.right!=null)
       {
           showTree(root.right);
       }
   }
   /*
   將元素裝載到集合
    */
   private void loadData(TreeNode root)
   {
       if (root.left!=null)
       {
           loadData(root.left);
       }
       datalist.add(root.data);
       if (root.right!=null)
       {
           loadData(root.right);
       }
   }
   public void sequentialTraversal (TreeNode root)
   {
       if(root==null)
       {
           throw new NullPointerException("null");
       }
       else {
           showTree(root);
       }
   }

}

 測試;構造一個如圖所示的二叉樹:

                                            

 

package com.wx.datastructure;
public class TestTwoForkedTree {
    public static void main(String[] args)
    {
        /*
               15
         12          19
     9      14   18      22
         13                   23
         */
        TwoForkedTree forkedTree=new TwoForkedTree();
        forkedTree.add(9);
        forkedTree.add(12);
        forkedTree.add(15);
        forkedTree.add(18);
        forkedTree.add(19);
        forkedTree.add(22);
        forkedTree.add(23);
        forkedTree.add(13);
        forkedTree.add(14);
        System.out.print("中序遍歷");
        //中序遍歷輸出一下
        forkedTree.sequentialTraversal(forkedTree.root);
        System.out.println("");
        System.out.print("新增元素17:");

        forkedTree.add(17);
        forkedTree.sequentialTraversal(forkedTree.root);
        System.out.println("");
        forkedTree.deleteTree(14);
        System.out.print("刪除元素14:");
        forkedTree.sequentialTraversal(forkedTree.root);
    }
}

 

總結: