1. 程式人生 > >資料結構---二分搜尋樹(java實現)

資料結構---二分搜尋樹(java實現)

樹的分類

1、 二分搜尋樹

2、 平衡二叉樹: AVL;紅黑樹

3、 堆; 並查集

4、線段樹;Trie(字典樹、字首樹)

二叉樹

二叉樹具有天然的遞迴結構

每個節點的左子樹也是二叉樹

每個節點的右子樹也是二叉樹

二叉樹不一定是“滿”的

一個節點也是二叉樹

NULL 空也是二叉樹

二分搜尋樹

二分搜尋樹是二叉樹

二分搜尋樹的每個節點的值大於其左子樹的所有節點的值

二分搜尋樹的每個節點的值小於其右子樹的所有節點的值

每一棵子樹也是二分搜尋樹

二分搜尋樹也不一定是“滿”二叉樹

二分搜尋樹的資料需要具有可比較性

二分搜尋樹的java程式碼實現

package com.pc.二分搜尋樹;

/**
 * @author 10430
 *下午10:41:23 2018年10月21日
 * 
 */
public class BinarySearchTree <E extends Comparable<E>>{
	
	Node root;
	
	public BinarySearchTree (E e) {
		root = new Node(e);
	}
	
	public BinarySearchTree () {
		root = null;
	}
	/**
	 * 向二分搜尋樹中增加節點 非遞迴實現
	 * @param e
	 */
public void add (E e) { if (root == null) { root = new Node(e); return; } Node dummyRoot = root ; while (true){ if (e.compareTo(dummyRoot.data)<0 ) { if (dummyRoot.left == null) { dummyRoot.left = new Node(e); return; } else { dummyRoot = dummyRoot.left; continue
; } } if (e.compareTo(dummyRoot.data)>0 ) { if (dummyRoot.right == null) { dummyRoot.right = new Node(e); return; } else { dummyRoot = dummyRoot.right; continue; } } } } /** * 查詢tree中是否包含某個節點 遞迴實現 * @param e */ public boolean find (E e) { return contains(root ,e); } private boolean contains (Node root , E e) { if (root == null) { return false; } if (root.data.compareTo(e)>0) { return contains(root.left,e); } else if (root.data.equals(e)) { return true ; }else { return contains(root.right,e); } } /** * 二分搜尋樹 查詢元素 (非遞迴實現) * @param e * @return */ public boolean findNotRecursive (E e) { if (root == null) { return false; } Node dummyRoot = root ; while (true){ if (e.compareTo(dummyRoot.data) == 0) { return true; } if (e.compareTo(dummyRoot.data)<0 ) { if (dummyRoot.left == null) { return false; } else { dummyRoot = dummyRoot.left; continue; } } if (e.compareTo(dummyRoot.data)>0 ) { if (dummyRoot.right == null) { return false; } else { dummyRoot = dummyRoot.right; continue; } } } } private class Node { private E data; public Node left; public Node right; private Node(E e) { this.data = e; left = null; right = null ; } } public static void main(String[] args) { BinarySearchTree<Integer> tree = new BinarySearchTree<Integer>(10); tree.add(8); tree.add(12); tree.add(6); tree.add(100); tree.add(128); // tree.findNotRecursive(6); System.out.println(tree.find(127)+" "+tree.findNotRecursive(127)); System.out.println(tree.find(6)+" "+tree.findNotRecursive(6)); System.out.println(tree.find(11)+" "+tree.findNotRecursive(11)); System.out.println(tree.find(128)+" "+tree.findNotRecursive(128)); } }