1. 程式人生 > 實用技巧 >樹結構入門總結貼

樹結構入門總結貼

參考:自己動手作圖深入理解二叉樹、滿二叉樹及完全二叉樹

package com.example.binarytreedemo;

import java.util.Arrays;

/**
 * @Author: zhangQi
 * @Date: 2020-08-11 17:22
 * @Description
 * 完全二叉樹的線性儲存
 */
public class FullBinaryTree {
    private Object[] arr;
    private int size;
    //gouzaoqi Construct initialize the parameters
    FullBinaryTree(int capacity){
        this.arr = new Object[capacity+1];
        this.size = 0;
    }

    public int getSize(){
        return this.size;
    }
    public boolean isEmpty(){
        return this.size == 0;
    }

    public void add(Object e,int index){
        assert index <= this.arr.length;
        this.arr[index] = e;
        this.size ++;
    }

    @Override
    public String toString(){
        return "FullBinaryTree{" +
                "arr=" + Arrays.toString(arr) +
                ", size=" + size +
                '}';
    }

    public static void main(String[] args) {
        FullBinaryTree fullBinaryTree = new FullBinaryTree(26);
        //存入26個字母 從下標1開始
        for (Character c = 'A';c<='Z';c++){
            fullBinaryTree.add(c,c-'A'+1);
        }

        System.out.println(fullBinaryTree.toString());
    }
}

輸出

FullBinaryTree{arr=[null, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], size=26}


完全二叉樹的線性儲存


package com.example.binarytreedemo;


import java.util.ArrayList;

/**
 * @Author: zhangQi
 * @Date: 2020-08-11 17:31
 * @De
 * 完全二叉樹的建立與遍歷
 */
public class BinaryTree {
    //結點
    private Node root;
    //結點數
    private int size;
    //存放結點
    private ArrayList<Node> list;

    public BinaryTree(){
        this.root = null;
        this.size = 0;
        this.list = new ArrayList<>();
    }

    public void createTree(Object[] array){
        for (int i=0;i<array.length;i++){
            Node node = new Node(array[i]);
            list.add(node);
            if(this.root==null){
                this.root = node;
            }
        }
        if(list.size()>0){
            //分佈到兩處結點上 屬於一個父結點 ?
            for(int i=0;i<array.length/2;i++){
                if(2*i+1<list.size()){
                    list.get(i).left=list.get(2*i+1);
                }
                if(2*i+2<list.size()){
                    list.get(i).right=list.get(2*i+2);
                }
            }
        }
    }

    //前序遍歷
    public void preOrder(Node root){
        if(root==null){
            return;
        }else{
            System.out.print(root.getData()+" ");
        }
        preOrder(root.left);
        preOrder(root.right);
    }

    public Node getRoot(){
        return root;
    }

    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        Character[] array = {'A','B','C','D','E','F','G','H','I','J','K','L',
                'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        binaryTree.createTree(array);
        binaryTree.preOrder(binaryTree.getRoot());
    }
}

輸出

A B D H P Q I R S E J T U K V W C F L X Y M Z G N O 


完全二叉樹的建立與遍歷