大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java二叉樹的實現示例

Java二叉樹的實現示例

更新時間:2022-05-20 12:29:47 來源:動力節點 瀏覽1959次

1.二叉樹

二叉樹是一種遞歸數據結構,其中每個節點最多可以有 2 個子節點。

二叉樹的一種常見類型是二叉搜索樹,其中每個節點的值都大于或等于左子樹中的節點值,并且小于或等于右子樹中的節點值樹。

這是這種二叉樹的直觀表示:

對于實現,我們將使用一個輔助Node類來存儲int值,并保留對每個孩子的引用:

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

然后我們將添加樹的起始節點,通常稱為根:

public class BinaryTree {
    Node root;
    // ...
}

2.常用操作

現在讓我們看看我們可以在二叉樹上執行的最常見的操作。

(1)插入元素

我們要介紹的第一個操作是插入新節點。

首先,我們必須找到要添加新節點的位置,以保持樹的排序。我們將從根節點開始遵循這些規則:

如果新節點的值小于當前節點的值,我們去左子樹

如果新節點的值大于當前節點的值,我們去右子樹

當當前節點為空時,我們到達了一個葉節點,我們可以在該位置插入新節點

然后我們將創建一個遞歸方法來進行插入:

private Node addRecursive(Node current, int value) {
    if (current == null) {
        return new Node(value);
    }
    if (value < current.value) {
        current.left = addRecursive(current.left, value);
    } else if (value > current.value) {
        current.right = addRecursive(current.right, value);
    } else {
        // value already exists
        return current;
    }
    return current;
}

接下來我們將創建從根節點開始遞歸的公共方法:

public void add(int value) {
    root = addRecursive(root, value);
}

讓我們看看如何使用此方法從我們的示例中創建樹:

private BinaryTree createBinaryTree() {
    BinaryTree bt = new BinaryTree();
    bt.add(6);
    bt.add(4);
    bt.add(8);
    bt.add(3);
    bt.add(5);
    bt.add(7);
    bt.add(9);
    return bt;
}

(2)尋找元素

現在讓我們添加一個方法來檢查樹是否包含特定值。

和以前一樣,我們將首先創建一個遍歷樹的遞歸方法:

private boolean containsNodeRecursive(Node current, int value) {
    if (current == null) {
        return false;
    } 
    if (value == current.value) {
        return true;
    } 
    return value < current.value
      ? containsNodeRecursive(current.left, value)
      : containsNodeRecursive(current.right, value);
}

在這里,我們通過將其與當前節點中的值進行比較來搜索該值;然后,我們將根據結果繼續左或右孩子。

接下來,我們將創建從root開始的公共方法:

public boolean containsNode(int value) {
    return containsNodeRecursive(root, value);
}

然后我們將創建一個簡單的測試來驗證樹是否真的包含插入的元素:

@Test
public void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() {
    BinaryTree bt = createBinaryTree();
    assertTrue(bt.containsNode(6));
    assertTrue(bt.containsNode(4)); 
    assertFalse(bt.containsNode(1));
}

添加的所有節點都應包含在樹中。

(3)刪除元素

另一種常見的操作是從樹中刪除一個節點。

首先,我們必須以與之前類似的方式找到要刪除的節點:

private Node deleteRecursive(Node current, int value) {
    if (current == null) {
        return null;
    }
    if (value == current.value) {
        // Node to delete found
        // ... code to delete the node will go here
    } 
    if (value < current.value) {
        current.left = deleteRecursive(current.left, value);
        return current;
    }
    current.right = deleteRecursive(current.right, value);
    return current;
}

一旦我們找到要刪除的節點,主要有 3 種不同的情況:

一個節點沒有孩子——這是最簡單的情況;我們只需要在它的父節點中用null替換這個節點

一個節點只有一個孩子——在父節點中,我們用它唯一的孩子替換這個節點。

一個節點有兩個孩子——這是最復雜的情??況,因為它需要樹重組

讓我們看看當節點是葉節點時如何實現第一種情況:

if (current.left == null && current.right == null) {
    return null;
}

現在讓我們繼續討論節點有一個孩子的情況:

if (current.right == null) {
    return current.left;
}
if (current.left == null) {
    return current.right;
}

在這里,我們返回非空子節點,以便將其分配給父節點。

最后,我們必須處理節點有兩個孩子的情況。

首先,我們需要找到將替換已刪除節點的節點。我們將使用即將被刪除節點的右子樹的最小節點:

private int findSmallestValue(Node root) {
    return root.left == null ? root.value : findSmallestValue(root.left);
}

然后我們將最小值分配給要刪除的節點,然后,我們將從右子樹中刪除它:

int smallestValue = findSmallestValue(current.right);
current.value = smallestValue;
current.right = deleteRecursive(current.right, smallestValue);
return current;

最后,我們將創建從根開始刪除的公共方法:

public void delete(int value) {
    root = deleteRecursive(root, value);
}

現在讓我們檢查刪除是否按預期工作:

@Test
public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() {
    BinaryTree bt = createBinaryTree();
    assertTrue(bt.containsNode(9));
    bt.delete(9);
    assertFalse(bt.containsNode(9));
}

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产99对白在线播放 | 美女久久精品 | 在线观看国产福利 | 亚洲综合色婷婷中文字幕 | 色偷偷88888欧美精品久久久 | 婷婷激情在线 | 日操夜操 | 99免费看| 免费中文字幕 | 久久精品视频2 | 精品一区二区三区视频在线观看 | 久久久久成人精品一区二区 | 久久久欧美综合久久久久 | 婷婷在线综合 | 91视频国内 | 99久久中文字幕伊人 | 亚洲精品中文字幕一区 | 久久中文字幕不卡一二区 | 欧美与黑人午夜性猛交久久久 | 香蕉一区 | 成人黄色片视频 | 国产色啪午夜免费视频 | 欧美成人免费午夜影视 | 九九热在线精品视频 | 日韩精品影视 | 亚洲精品不卡午夜精品 | 91视频最新网址 | 亚洲成a人v欧美综合天 | 久久免费国产精品一区二区 | 美国毛片一级e片黑人片 | 亚洲大片免费看 | 久草在线免费看视频 | 亚洲免费视频在线 | 四虎网站在线观看 | 久久九九亚洲精品 | 免费观看男女羞羞的视频网站 | 97在线碰碰观看免费高清 | 毛片毛片毛片毛片毛片毛片毛片 | 色综合精品久久久久久久 | 亚洲精品美女在线观看 | 欧美精品日本一级特黄 |