重溫數據結構:樹 及 Java 實現(轉)

轉自:http://blog.csdn.net/u011240877/article/details/53193877

讀完本文你將了解到:

    • 什么是樹
    • 樹的相關術語
      • 根節點父親節點孩子節點葉子節點如上所述
      • 節點的度
      • 樹的度
      • 節點的層次
      • 樹的高度
      • 樹的深度
    • 樹的兩種實現
      • 數組表示
      • 鏈表表示的節點
    • 樹的幾種常見分類及使用場景

?

數據結構,指的是數據的存儲形式,常見的有線性結構(數組、鏈表,隊列、棧),還有非線性結構(樹、圖等)。

今天我們來學習下數據結構中的?

什么是樹

線性結構中,一個節點至多只有一個頭節點,至多只有一個尾節點,彼此連接起來是一條完整的線。

比如鏈表和數組:

shixin tai shuai le

而樹,非線性結構的典型例子,不再是一對一,而變成了一對多(而圖則可以是 多對多),如下圖所示:

shixin tai shuai le

可以看到:

  • 圖中的結構就像一棵倒過來的樹,最頂部的節點就是“根節點 (root 節點)
  • 每棵樹至多只有一個根節點
  • 根節點生出多個孩子節點,每個孩子節點只有一個父節點,每個孩子節點又生出多個孩子
  • 父親節點 (parent) 和孩子節點 (child) 是相對的
  • 沒有孩子節點的節點成為葉子節點 (leaf)

樹的相關術語

根節點、父親節點、孩子節點、葉子節點如上所述。

shixinzhang

節點的度

一個節點直接含有的子樹個數,叫做節點的度。比如上圖中的 3 的度是 2,10 的度是 1。

樹的度

一棵樹中?最大節點的度,即哪個節點的子節點最多,它的度就是 樹的度。上圖中樹的度為 2 。

節點的層次

從根節點開始算起,根節點算第一層,往后底層。比如上圖中,3 的層次是 2,4 的層次是 4。

樹的高度

樹的高度是從葉子節點開始,自底向上增加

樹的深度

與高度相反,樹的深度從根節點開始,自頂向下增加

整個樹的高度、深度是一樣的,但是中間節點的高度 和 深度是不同的,比如上圖中的 6 ,高度是 2 ,深度是 3。

樹的兩種實現

從上述概念可以得知,樹是一個遞歸的概念,從根節點開始,每個節點至多只有一個父節點,有多個子節點,每個子節點又是一棵樹,以此遞歸。

樹有兩種實現方式:

  • 數組
  • 鏈表

數組表示:

我們可以利用每個節點至多只有一個父節點這個特點,使用?父節點表示法?來實現一個節點:

public class TreeNode {private Object mData;   //存儲的數據private int mParent;   //父親節點的下標public TreeNode(Object data, int parent) {mData = data;mParent = parent;}public Object getData() {return mData;}public void setData(Object data) {mData = data;}public int getParent() {return mParent;}public void setParent(int parent) {mParent = parent;}
}

  

上述代碼中,使用 角標 來指明父親節點的位置,使用這個節點組成的數組就可以表示一棵樹。

public static void main(String[] args){TreeNode[] arrayTree = new TreeNode[10];
}

  

用數組實現的樹表示下面的樹,(其中一種 )結果就是這樣的:

shixinzhang

shixinzhang

數組實現的樹節點使用角標表示父親的索引,下面用鏈表表示一個節點和一棵樹:

鏈表表示的節點:

public class LinkedTreeNode {private Object mData;   //存儲的數據private LinkedTreeNode mParent;   //父親節點的下標private LinkedTreeNode mChild;  //孩子節點的引用public LinkedTreeNode(Object data, LinkedTreeNode parent) {mData = data;mParent = parent;}public Object getData() {return mData;}public void setData(Object data) {mData = data;}public Object getParent() {return mParent;}public void setParent(LinkedTreeNode parent) {mParent = parent;}public LinkedTreeNode getChild() {return mChild;}public void setChild(LinkedTreeNode child) {mChild = child;}}

  

使用引用,而不是索引表示父親與孩子節點。

使用一個 List, 元素是 LinkedTreeNode,就可以表示一棵鏈表樹:

public static void main(String[] args){LinkedList<LinkedTreeNode> linkedTree = new LinkedList<>();
}

  

這樣只需知道 根節點就可以遍歷整個樹。知道某個節點也可以獲取它的父親和孩子。

樹的幾種常見分類及使用場景

樹,為了更好的查找性能而生。

常見的樹有以下幾種分類:

  • 二叉樹
  • 平衡二叉樹
  • B 樹
  • B+ 樹
  • 哈夫曼樹
  • 紅黑樹

接下來陸續介紹完回來補使用場景。

轉載于:https://www.cnblogs.com/SimonHu1993/p/7661671.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454384.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Powershell檢測AD賬戶密碼過期時間并郵件通知

腳本主要實現了兩個功能 &#xff1a; 一能判斷賬戶密碼的過期時間并通過郵件通知到賬戶&#xff1b; 二是將這些即將過期的賬戶信息累計通知到管理員。 腳本如下&#xff1a; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051…

js list刪除指定元素_vue.js

vue.js 中M V MV代表哪一部分 <插值表達式&#xff08;v-cloak v-text v-html v-bind&#xff08;縮寫是:&#xff09; v-on&#xff08;縮寫是&#xff09; v-model v-for v-if v-show &#xff09;<body><div id"app"><!-- 使用 v-cloak 能夠解決…

修改db2管理服務器,創建DB2管理服務器的兩種情況

DB2管理服務器在創建時分為創建一個和創建多個兩種情況&#xff0c;下面就為您詳細介紹這兩種創建DB2管理服務器的情況&#xff0c;供您參考學習。一、創建DB2管理服務器(只能創建一個)1、首先創建管理服務組用戶(可不建)命令&#xff1a;sudo groupadd dasadm12、創建用戶命令…

系統程序員成長計劃-走近專業程序員

轉載時請注明出處和作者聯系方式 文章出處&#xff1a;http://www.limodev.cn/blog 作者聯系方式&#xff1a;李先靜 <xianjimli at hotmail dot com> 需求簡述 用C語言編寫一個雙向鏈表。如果你有一定的C語言編程經驗&#xff0c;這自然是小菜一碟。有的讀者可能連一個…

Python 內置模塊之 asyncio(異步iO)

python3.0&#xff0c;標準庫里的異步網絡模塊&#xff1a;select(非常底層) &#xff0c;第三方異步網絡庫&#xff1a;Tornado&#xff0c;gevent python3.4&#xff0c;asyncio&#xff1a;支持 TCP &#xff0c;子進程 現在的asyncio&#xff0c;有了很多的模塊已經在支持…

前端js文件合并三種方式

最近在思考前端js文件該如何合并&#xff0c;當然不包括不能合并文件&#xff0c;而是我們能合并的文件&#xff0c;想了想應該也只有三種方式。 三個方式如下&#xff1a; 1. 一個大文件&#xff0c;所有js合并成一個大文件&#xff0c;所有頁面都引用它。 2. 各個頁面大文件&…

我們的系統檢測到您的計算機網絡中存在異常流量_如何建立我們的網絡防線?入侵檢測,確保我們的網絡安全...

目前我們的網絡安全趨勢日益嚴峻&#xff0c;那么如何利用入侵檢測系統確保我的網絡安全呢&#xff1f;入侵檢測又是什么呢&#xff1f;網絡安全入侵檢測技術是為保證計算機系統的安全&#xff0c;而設計與配置的一種能夠及時發現并報告系統中未授權或異常現象的技術&#xff0…

sql修改鏈接服務器名稱,SQL Server 創建鏈接服務器的腳本,自定義鏈路服務器的簡短名稱...

USE [master]GO/****** Object: LinkedServer [SQL01] Script Date: 2020/4/9 11:51:17 ******/EXEC master.dbo.sp_addlinkedserver server N‘SQL01‘, srvproductN‘‘, providerN‘SQLNCLI‘, datasrcN‘域名或者IP‘/* For security reasons the linked server remot…

mybatis $和#源代碼分析

JDBC中&#xff0c;主要使用兩種語句&#xff0c;一種是支持參數化和預編譯的PreparedStatement,支持原生sql,支持設置占位符&#xff0c;參數化輸入的參數&#xff0c;防止sql注入攻擊&#xff0c;在mybatis的mapper配置文件中&#xff0c;我們通過使用#和$告訴mybatis我們需要…

git 命令詳解和常見問題解決

功能一 提交&#xff1a;1:git init # 初始化&#xff0c;表示即將對當前文件夾進行版本控制2:git status # 查看Git當前狀態&#xff0c;如&#xff1a;那些文件被修改過、那些文件還未提交到版本庫等。3:git add . # 添加當前目錄下所有文件到版本…

辭職日記----記錄31歲的程序員跳槽心態

vcleaner http://topic.csdn.net/u/20080626/23/8f6a8ecc-c072-43ee-bf2d-7ac2286b6805.html http://topic.csdn.net/u/20080704/23/858fc00d-ec14-4db7-93be-34903b7f157a.html 轉載他的離職日記&#xff0c;有許多東西值得我們認真思考&#xff0c;人活著到底為了什么&a…

從Android源碼的角度分析Binder機制

IPC 為了弄懂IPC的來龍去脈&#xff0c;我將從以下三個方面為大家來講解&#xff0c;希望對大家理解IPC會有幫助 什么是IPC IPC是Inter Process Communication的縮寫&#xff0c;其意思就是進程間的通信&#xff0c;也就是兩個進程之間的通信過程。我們都知道在Android系統中&a…

excel vba 調用webbrowser_VBA 公式與函數

一, 在單元格中輸入公式的3種方法:1) 用VBA在單元格中輸入普通公式Sub formula_1() Range("d2") ("B2 * C2") End Sub運行程序后,在D2的單元格內顯示的是公式 B2 * C2 ,并非程序返回值.下文(二)中會介紹另外一種直接返回值的方式想要通過程序一…

內部類可以引用它的包含類的成員嗎?有沒有什么限制?

最近看到一道面試題&#xff1a;內部類可以引用它的包含類的成員嗎&#xff1f;有沒有什么限制&#xff1f; 答案大部分都是這樣子的&#xff1a; 完全可以。如果不是靜態內部類&#xff0c;那沒有什么限制&#xff01; 一個內部類對象可以訪問創建它的外部類對象的成員包括私有…

松下NPM服務器怎么備份系統,松下(Panasonic)-NPM校正amp;CPK完整版教程,一步步帶你成為SMT設備大神!...

馬上注冊&#xff0c;結交更多技術專家&#xff0c;享用更多功能&#xff0c;讓你輕松解決各種三星貼片機問題您需要 登錄 才可以下載或查看&#xff0c;沒有帳號&#xff1f;立即注冊 xa8f80375060fa05b8aebe69ffa21080c.gif (5.26 KB, 下載次數: 3)2019-8-12 00:02 上傳f5aae…

Python 模塊之科學計算 Pandas

目錄 一、Pandas簡介 數據結構 二、Series series 的創建 Series值的獲取 Series的運算 Series缺失值檢測 Series自動對齊 Series及其索引的name屬性 三、DataFrame 創建 Index對象 通過索引值或索引標簽獲取數據 自動化對齊 四、文件操作 文件讀取 數據庫數據…

根據 設備名(br0/eth0/em0)稱獲取 當前機器的IP地址與子網掩碼信息

#!/usr/bin/env python 根據 設備名(br0/eth0/em0)稱獲取 當前機器的IP地址與子網掩碼信息import socket, struct, fcntldef get_ipaddress(ifname eth0):s socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915, # SI…

我的程序生涯

本文僅為愛好程序及向往真正之程序員者所作&#xff0c;其余人等可忽略下文。 如今&#xff0c;接觸CS幾近八年&#xff0c;不學無術&#xff0c;所精之物鮮也&#xff0c;以至一事無成。 現回憶吾程序之生涯&#xff0c;以整理繁雜之心緒。 1. 接觸計算機和編程語言 02年始大…

機器學習中qa測試_如何對機器學習做單元測試

作者&#xff1a;Chase Roberts編譯&#xff1a;ronghuaiyang導讀養成良好的單元測試的習慣&#xff0c;真的是受益終身的&#xff0c;特別是機器學習代碼&#xff0c;有些bug真不是看看就能看出來的。在過去的一年里&#xff0c;我把大部分的工作時間都花在了深度學習研究和實…

項目寶提供的服務器,開源WebSocket服務器項目寶貝魚CshBBrain V4.0.1 和 V2.0.2發布

開源WebSocket服務器項目寶貝魚CshBBrain V4.0.1 和 V2.0.2發布更新的功能列表如下&#xff1a;1.解決開啟廣播消息開關時&#xff0c;不能同時接入2個客戶端的重大缺陷。2.對廣播消息做了重大優化&#xff0c;從以前一個線程發送廣播消息進化到使用工作線程池中的線程并行的發…