在 Java 中實現樹

Rupam Yadav 2023年1月30日 2021年10月2日
  1. 使用遞迴方法實現樹
  2. 在 Java 中使用通用方法和 ArrayList 建立樹
在 Java 中實現樹

在本教程中,我們將看到兩種在 Java 中建立樹結構的方法。樹結構在多種方面都很有用,例如建立資料夾和檔名的目錄。

使用遞迴方法實現樹

在這個例子中,我們建立了最多有兩個子節點的二叉樹,一個在左邊,另一個在右邊。根節點是所有子節點的父節點。每個節點儲存一個值。下面,我們上兩節課;一個是代表樹中節點的 Node,另一個是對節點執行操作的 JavaTree 類。

Node 類具有三個變數,第一個是要儲存在 int 資料型別的節點中的值。然後我們取兩個變數,分別用於 leftright 子節點;兩個變數都是 Node 型別。我們建立 Node 類的建構函式並從引數初始化 value;左右變數設定為

JavaTree 類中,我們採用一個 Node 型別的變數並將其命名為 root。然後我們建立一個方法 traverseRecursionTree(),它以 Node 作為引數,在該方法中,我們檢查 node 是否為 null;如果不是,那麼我們從自身呼叫 traverseRecursionTree() 方法並傳遞 nodeleft 部分。之後,我們列印 nodevalue 並再次從自身呼叫該方法並傳遞 right node。從自身呼叫函式的過程稱為遞迴。

main() 方法中,我們建立了一個 javaTree 物件,然後初始化所有變數,如根、根的左孩子和右孩子。我們還製作了根的孩子的左孩子。我們使用包含所有子節點的 javaTree.root 列印整個樹。

class Node {

    int value;
    Node left;
    Node right;

    public Node(int value) {
        this.value = value;
        left = null;
        right = null;
    }
}

public class JavaTree {
    Node root;

    public void traverseRecursionTree(Node node) {
        if (node != null) {
            traverseRecursionTree(node.left);
            System.out.print(" " + node.value);
            traverseRecursionTree(node.right);
        }
    }

    public static void main(String[] args) {

        JavaTree javaTree = new JavaTree();

        javaTree.root = new Node(10);
        javaTree.root.left = new Node(6);
        javaTree.root.right = new Node(5);
        javaTree.root.left.left = new Node(3);

        System.out.print("Binary Tree: ");

        javaTree.traverseRecursionTree(javaTree.root);
    }
}

輸出:

Binary Tree:  3 6 10 5

在 Java 中使用通用方法和 ArrayList 建立樹

在前面的方法中,我們僅限於一種型別的資料作為 int 節點中的值。在這個程式中,我們使用泛型方法,允許我們使用我們選擇的任何資料型別。我們有一個類 Node<T>,這裡 <T> 告訴我們可以使用任何資料型別作為字串。在類中,我們宣告瞭三個變數,首先是型別為 Troot,然後是型別為 Node<<T>parent,最後是名為 Node<T> 的 ArrayList 作為 child

Node 的建構函式中,我們將 T 型別的 root 設定為類變數 root。然後我們初始化 children ArrayList。現在,為了在 parent 中新增孩子,我們建立了一個 addChild() 函式,該函式採用 T 型別的 child。在 addChild() 函式中,我們建立了一個 Node<T> - childNode 的物件,並使用 this 關鍵字將其父級的上下文設定為當前類的上下文。接下來,我們獲取 children ArrayList,新增 childNode,並返回 childNode

我們在 Node<T> 類中有多個方法可以用來執行操作,例如返回 rootgetRoot() 方法,isRoot() 函式檢查當前節點是否是 root。我們建立了一個 getLevel() 函式,它返回樹中節點的級別。最後,我們覆蓋了一個 toString() 方法,如果它不為空,則返回整個樹。

現在我們建立具有 main() 方法的 Javatree 類。我們在類中建立 Node<String>xy。在這裡,我們使用 String 作為型別。在兩個建構函式中,我們都傳遞了每棵樹的根。我們使用 getRoot() 列印 root,然後我們建立一個名為 child1Node<String> 物件,並使用 x 物件呼叫 addChild() 方法,這裡我們傳遞的值 child1 作為引數。在 child1 塊中,我們使用其物件建立 child1 的三個孩子並呼叫 addChild()

我們使用相同的過程建立另一個名為 child2 的樹。

import java.util.ArrayList;

class Node<T> {
    private final T root;
    private Node<T> parent;
    private final ArrayList<Node<T>> children;

    public Node(T root) {
        this.root = root;
        children = new ArrayList<>();
    }

    public Node<T> addChild(T child) {
        Node<T> childNode = new Node<T>(child);
        childNode.parent = this;
        this.children.add(childNode);
        return childNode;
    }

    public T getRoot() {
        return root;
    }

    public boolean isRoot() {
        return parent == null;
    }

    public boolean isLeaf() {
        return children.size() == 0;
    }

    public int getLevel() {
        if (this.isRoot())
            return 0;
        else
            return parent.getLevel() + 1;
    }

    @Override
    public String toString() {
        return root != null ? root.toString() : "null";
    }
}

public class JavaTree {
    public static void main(String[] args) {

        Node<String> x = new Node<String>("parent1");
        Node<String> y = new Node<String>("parent2");

        System.out.println(x.getRoot());

        Node<String> child1 = x.addChild("child1");
        {
            Node<String> innerChild1 = child1.addChild("innerChild1OfChild1");
            Node<String> innerChild2 = child1.addChild("innerChild2OfChild1");
            Node<String> innerChild3 = child1.addChild("innerChild3OfChild1");

            System.out.println("-" + child1);

            System.out.println("--" + innerChild1);
            System.out.println("--" + innerChild2);
            System.out.println("--" + innerChild3);

            System.out.println("Level of child1: " + child1.getLevel());
            System.out.println("Level of innerChild2 in Child1: " + innerChild2.getLevel());


        }

        System.out.println();

        System.out.println(y.getRoot());


        Node<String> child2 = x.addChild("child2");
        {
            Node<String> innerChild1 = child2.addChild("innerChild2OfChild2");
            Node<String> innerChild2 = child2.addChild("innerChild3OfChild2");
            Node<String> innerChild3 = child2.addChild("innerChild4OfChild2");
            {
                Node<String> innerChild4 = innerChild3.addChild("innerChild4OfChild3");
                System.out.println(innerChild4.getLevel());
                System.out.println("\nIs inner Child4 Leaf? " + innerChild4.isLeaf());
            }

            System.out.println("-" + child2);

            System.out.println("--" + innerChild1);
            System.out.println("--" + innerChild2);
            System.out.println("--" + innerChild3);

            System.out.println("Level of child1: " + child2.getLevel());
            System.out.println("Level of innerChild2 in Child2: " + innerChild2.getLevel());


        }


    }
}

輸出:

parent1
-child1
--innerChild1OfChild1
--innerChild2OfChild1
--innerChild3OfChild1
Level of child1: 1
Level of innerChild2 in Child1: 2

parent2
3

Is inner Child4 Leaf? true
-child2
--innerChild2OfChild2
--innerChild3OfChild2
--innerChild4OfChild2
Level of child1: 1
Level of innerChild2 in Child2: 2
Author: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

相關文章 - Java Tree