1. 程式人生 > >資料結構之二叉查詢樹Java實現原始碼及註釋

資料結構之二叉查詢樹Java實現原始碼及註釋

二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。以下是樓主用java寫的一個二叉搜尋樹類的,包含建立,新增新元素,以及常用的四種遍歷方式。

//首先定義一個BNode節點,裡面包含left、right初始化為null,以及int型陣列data。
class BNode{
    BNode left=null;
    BNode right=null;
    int data;
    public BNode(int data){
        this.data=data;
    }
}

public class BinaryTree{
    BNode root=null;
//插入新的元素
    public void insert(int data) {
        BNode newBNode=new BNode(data);
        if(root==null) {
            root=newBNode;
        }else {

//定義一個Node型父親節點parsent
            BNode parent=root;      

//迴圈至找到節點存放的合適位置

//如果節點數值小於當前位置所指向值,判斷當前節點左孩子是否存在?若當前節點左孩子不存在,將新的節點插入到前節點左方並返回結束迴圈,若當前節點左孩子存在,則parsent指向自身的左孩子
            while(true) {            
                if(data<parent.data) {     
                    if(parent.left==null) {   
                        parent.left=newBNode;  
                        return;
                    }else {
                        parent=parent.left;    
                    }
                }

//如果節點數值大於當前位置所指向值,判斷當前節點右孩子是否存在?若當前節點右孩子不存在,將新的節點插入到前節點右方並返回結束迴圈,若當前節點右孩子存在,則parsent指向自身的右孩子

    else if(data>parent.data) {  
                    if(parent.right==null) {    
                        parent.right=newBNode; 
                        return;
                    }else {
                        parent=parent.right;  
                    }
                }
            }
        }
    }

  //遞迴思想遍歷二叉樹,很容易理解這裡就不囉嗦了


    //中序遍歷(左-根-右)
    public void inOrder(BNode root) {
        if(root!=null) {
            inOrder(root.left);        
            System.out.print(root.data+" ");
            inOrder(root.right);
        }
    }
    public void inOrder() {
        this.inOrder(this.root);
    }
   
    //先序遍歷(根-左-右)
    public void preOrder(BNode root) {
        if(root!=null) {
            System.out.print(root.data+" ");
            preOrder(root.left);
            preOrder(root.right);
        }
    }
    public void preOrder() {
        this.preOrder(this.root);
    }
   
    //後續遍歷(左-右-根)
    public void posOrder(BNode root) {
        if(root!=null) {
            posOrder(root.left);
            posOrder(root.right);
            System.out.print(root.data+" ");
        }
    }
    public void posOrder() {
        this.posOrder(this.root);
    }

    //層次遍歷可以利用佇列的性質完成,其主要思路如下:先將根節點放入佇列中,然後每次都從佇列中取出一個節點列印該節點的值,若這個節點有子節點,則將它的子節點放入佇列尾,直到佇列為空。
    public void layerOrder() {
        if(this.root==null) {
            return;
        }
        Queue<BNode> queue=new LinkedList<>();
        queue.add(this.root);
        while(!queue.isEmpty()) {
            BNode p=queue.poll();
            System.out.print(p.data+" ");
            if(p.left!=null) {
                queue.add(p.left);
            }
            if(p.right!=null) {
                queue.add(p.right);
            }
        }

    }
 
    public static void main(String[] args) {
        BinaryTree test=new BinaryTree();
        test.insert(3);
        test.insert(2);
        test.insert(1);
        test.insert(4);
        test.insert(5);
        //test.inOrder();
        //test.preOrder();
        test.posOrder();

    }
}

總結:上訴測試結構test.inOrder()列印輸出1 2 3 4 5,test.preOrder()列印輸出3 2 1 4 5, test.posOrder()列印輸出1 2 5 4 3,test.layerOrder()列印輸出3 2 1 4 5。