初識數據結構——二叉樹從基礎概念到實踐應用

在這里插入圖片描述
在這里插入圖片描述
?(click)


初識二叉樹:從基礎概念到實踐應用🌳

一、樹型結構基礎

1.1 樹的基本概念

在這里插入圖片描述

是一種非線性的數據結構,由n(n>0)個有限節點組成一個具有層次關系的集合。它看起來像一棵倒掛的樹,根朝上而葉朝下。

關鍵特點

  • 有且僅有一個根節點,沒有前驅節點
  • 除根節點外,其余節點被分成M(M>0)個互不相交的子樹
  • 樹是遞歸定義

重要術語

  • 結點的度:一個結點含有子樹的個數
  • 樹的度:樹中所有結點度的最大值
  • 葉子結點:度為0的結點
  • 雙親結點/父結點:含有子結點的結點
  • 孩子結點/子結點:一個結點含有的子樹的根結點
  • 根結點:沒有雙親結點的結點
  • 結點的層次:從根開始定義,根為第1層
  • 樹的高度/深度:樹中結點的最大層次

1.2 樹的表示方法

最常用的表示方法是孩子兄弟表示法

class Node {int value;        // 樹中存儲的數據Node firstChild;  // 第一個孩子引用Node nextBrother; // 下一個兄弟引用
}

在這里插入圖片描述

二、二叉樹詳解

2.1 二叉樹概念

二叉樹是結點的一個有限集合,該集合:

  1. 或者為空
  2. 或者由一個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成

特點

  • 二叉樹不存在度大于2的結點
  • 二叉樹的子樹有左右之分,次序不能顛倒,是有序樹
    在這里插入圖片描述

2.2 特殊二叉樹

  1. 滿二叉樹:每層的結點數都達到最大值。層數為K,結點總數是2^K-1
  2. 完全二叉樹:深度為K,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編號從0至n-1的結點一一對應
    在這里插入圖片描述

2.3 二叉樹的性質

  1. 非空二叉樹的第i層最多有2^(i-1)個結點
  2. 深度為K的二叉樹最大結點數是2^K-1
  3. 對于任何二叉樹,n0(葉子結點) = n2(度為2的結點) + 1
  4. 具有n個結點的完全二叉樹深度為?log?(n+1)?
  5. 完全二叉樹的父子結點關系:
    • 父結點序號:(i-1)/2
    • 左孩子序號:2i+1
    • 右孩子序號:2i+2

2.4 二叉樹的存儲

鏈式存儲
// 孩子表示法
class Node {int val;    // 數據域Node left;  // 左孩子引用,常常代表左孩?為根的整棵左?樹 Node right; // 右孩子引用,常常代表右孩?為根的整棵右?樹 
}// 孩子雙親表示法
class Node {int val;Node left;  // 左孩子引用,常常代表左孩?為根的整棵左?樹 Node right; // 右孩子引用,常常代表右孩?為根的整棵右?樹 Node parent; // 當前節點的根節點
}

三、二叉樹遍歷

遍歷(Traversal)是指沿著某條搜索路線,依次對樹中每個結點均做?次且僅做?次訪問。訪問結點所做的操作依賴于具體的應?問題(比如:打印節點內容、節點內容加1)。遍歷是?叉樹上最重要的操作之一,是二叉樹上進行其它運算之基礎。
在這里插入圖片描述

3.1 遞歸遍歷

  1. (NLR)前序遍歷:根節點 -> 左子樹 -> 右子樹
  2. (LNR)中序遍歷:左子樹 -> 根節點 -> 右子樹
  3. (LRN)后序遍歷:左子樹 -> 右子樹 -> 根節點
    在這里插入圖片描述
// 前序遍歷
void preOrder(Node root) {if (root == null) return;System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right);
}// 中序遍歷
void inOrder(Node root) {if (root == null) return;inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);
}// 后序遍歷
void postOrder(Node root) {if (root == null) return;postOrder(root.left);postOrder(root.right);System.out.print(root.val + " ");
}

3.2 層序遍歷

從根節點出發,按層次從上到下、從左到右訪問結點。

void levelOrder(Node root) {if (root == null) return;Queue<Node> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {Node cur = queue.poll();System.out.print(cur.val + " ");if (cur.left != null) queue.offer(cur.left);if (cur.right != null) queue.offer(cur.right);}
}

四、二叉樹基本操作

代碼示例:

// 獲取節點個數
int size(Node root) {if (root == null) return 0;return 1 + size(root.left) + size(root.right);
}// 獲取葉子節點個數
int getLeafNodeCount(Node root) {if (root == null) return 0;if (root.left == null && root.right == null) return 1;return getLeafNodeCount(root.left) + getLeafNodeCount(root.right);
}// 獲取第k層節點個數
int getKLevelNodeCount(Node root, int k) {if (root == null || k <= 0) return 0;if (k == 1) return 1;return getKLevelNodeCount(root.left, k-1) + getKLevelNodeCount(root.right, k-1);
}// 獲取二叉樹高度
int getHeight(Node root) {if (root == null) return 0;return 1 + Math.max(getHeight(root.left), getHeight(root.right));
}// 查找值為val的節點
Node find(Node root, int val) {if (root == null) return null;if (root.val == val) return root;Node left = find(root.left, val);if (left != null) return left;return find(root.right, val);
}

結語

二叉樹是數據結構中的核心內容,掌握好二叉樹對于理解更復雜的數據結構和算法至關重要。建議讀者在學習理論的同時,多動手實現代碼,解決實際問題,才能真正掌握二叉樹的精髓。


在這里插入圖片描述

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

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

相關文章

駝峰命名法(Camel Case)與匈牙利命名法(Hungarian Notation)詳解

駝峰命名法&#xff08;Camel Case&#xff09;與匈牙利命名法&#xff08;Hungarian Notation&#xff09;詳解及對比? ?1. 駝峰命名法&#xff08;Camel Case&#xff09;? ?定義? 駝峰命名法&#xff08;Camel Case&#xff09;是一種變量、函數、類等標識符的命名方…

keil 中優化等級的bug

一&#xff0c;問題描述 程序中代碼有的執行&#xff0c;有的不執行&#xff0c;仔細研究&#xff0c;查詢人工智能。 程序中printf打印后面的代碼不執行&#xff0c; 然后過幾十個函數又開始正常了。 二.分析問題 跳過函數一般又判斷和Goto等語句&#xff0c;其它的溢出和錯誤…

織夢dedecms網站如何修改上一篇下一篇的標題字數

一般情況下&#xff0c;如果你的上一篇和下一篇是2行布局就不需要限制標題的字數了&#xff0c;如果你要一行布局上一篇和下一篇標題過長就會打亂網頁布局&#xff0c;那么限制上一篇和下一篇的標題字數是需要的&#xff0c;避免頁面看起來雜亂不堪。 織夢dedecms網站如何修改…

信創系統 sudoers 權限配置實戰!從小白到高手

好文鏈接&#xff1a;實戰&#xff01;銀河麒麟 KYSEC 安全中心執行控制高級配置指南 Hello&#xff0c;大家好啊&#xff01;今天給大家帶來一篇關于信創終端操作系統中 sudoers 文件詳解的實用文章&#xff01;在 Linux 系統中&#xff0c;sudo 是一項非常重要的權限控制機制…

《明解C語言入門篇》讀書筆記四

目錄 第四章&#xff1a;程序的循環控制 第一節&#xff1a;do語句 do語句 復合語句&#xff08;程序塊&#xff09;中的聲明 讀取一定范圍內的值 邏輯非運算符 德摩根定律 德摩根定律 求多個整數的和及平均值 復合賦值運算符 后置遞增運算符和后置遞減運算符 練習…

vite+vue2+elementui構建之 vite.config.js

webpack版本太低&#xff0c;構建依賴太多&#xff0c;頭大。 各種查閱資料&#xff0c;弄了一份直通構建vite構建elementUi核心文件&#xff0c; 構建基于開源若依vue2vue3版本改造&#xff0c;感謝開源&#xff0c;感謝若依。 package.json 地址 vitevue2elementui構建之…

超參數詳解:從基礎概念到優化策略的全面指南

摘要 本文深入解析機器學習中超參數的核心概念&#xff0c;詳細對比參數與超參數的本質區別&#xff0c;系統介紹學習率、隱含層數量等常見超參數類型&#xff0c;以及網格搜索、貝葉斯優化等主流尋優方法。結合超參數搜索的標準流程&#xff0c;通過具體案例演示如何高效調整…

計算機視覺與深度學習 | LSTM原理及與卡爾曼濾波的融合

長短期記憶網絡(LSTM)是一種特殊的循環神經網絡(RNN),旨在解決傳統RNN在處理長序列數據時出現的梯度消失和梯度爆炸問題。以下為你詳細介紹其基本原理: 核心思想:LSTM的核心思想是引入記憶單元和門控機制來控制信息的流動,從而解決傳統RNN的梯度消失問題。記憶單元類似…

EXCEL常用函數公式和VBA匯總第二篇

系列文章目錄 文章目錄 系列文章目錄前言一、excel公式應用1.rand函數2.rand函數隨機排序3.rand函數提取數據4.correl函數5.SUBSTITUTE函數6.MAX組合函數7.分析下班時間8.柏拉圖自動排序 總結 前言 一、excel公式應用 1.rand函數 用excel生成1-5的隨機數字&#xff0c;其中對…

iOS 類與對象底層原理

iOS 類與對象底層原理 文章目錄 iOS 類與對象底層原理探索對象本質objc_setProperty 源碼cls與類的關聯原理聯合體isa的類型isa_t 原理探索initIsa方法通過setClass方法中的shiftcls來驗證綁定的一個流程通過 isa & ISA_MSAK通過object_getClass通過位運算 類&類的結構…

浮點數:IEEE 754標準

IEEE 754 標準是一種由電氣和電子工程師協會&#xff08;IEEE&#xff09;制定的浮點數表示的標準&#xff0c;廣泛應用于計算機系統中&#xff0c;下面是詳細介紹&#xff1a; 歷史背景 在 IEEE 754 標準出現之前&#xff0c;不同的計算機系統采用各自的浮點數表示方法&…

centos7部署k8s集群

環境準備 服務器三臺 10.0.0.70master 10.0.0.71worker1 10.0.0.72worker2 配置yum源&#xff08;集群機器執行&#xff09; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 安裝常用軟件 yum -y install lrzsz vim net-tools關閉f…

第三方軟件檢測報告:熱門辦公軟件評估及功能表現如何?

第三方軟件檢測報告是重要文件。它用于對軟件做專業評估。能反映軟件各項性能。能反映軟件安全性等指標。該報告為軟件使用者提供客觀參考。該報告為軟件開發者提供客觀參考。有助于發現問題。還能推動軟件改進。 檢測概述 本次檢測針對一款熱門辦公軟件。采用了多種先進技術…

Linux:41線程控制lesson29

1.線程的優點&#xff1a; ? 創建?個新線程的代價要?創建?個新進程?得多 創建好線程只要調度就好了 ? 與進程之間的切換相?&#xff0c;線程之間的切換需要操作系統做的?作要少很多 為什么&#xff1f; ? 最主要的區別是線程的切換虛擬內存空間依然是相同的&#x…

【MCP】從一個天氣查詢服務帶你了解MCP

1. 前言 這篇文章將通過一個集成高德天氣查詢的 MCP Server 用例&#xff0c;帶你上手開發自己的 MCP Server ,文章將通過以下三種方式&#xff08;自己編寫 Client 端代碼&#xff0c;使用 mcp-cli 自帶頁面&#xff0c;集成到 Claude 桌面版等&#xff09;帶你測試自己的 MC…

SHCTF-REVERSE

前言 之前寫的&#xff0c;一直沒發&#xff0c;留個記錄吧&#xff0c;萬一哪天記錄掉了起碼在csdn有個念想 1.ezapk 反編譯 快速定位關鍵函數 package com.mycheck.ezjv;import adrt.ADRTLogCatReader; import android.app.Activity; import android.content.Context; impo…

安卓觸摸事件分發機制分析

1. 前言 &#x1f3af; 一句話總結&#xff1a; 觸摸事件&#xff08;TouchEvent&#xff09;會從 Activity 層開始&#xff0c;按從外到內的方式傳遞給每一個 ViewGroup/View&#xff0c;直到某個 View 消費&#xff08;consume&#xff09; 它&#xff0c;事件傳遞就會停止…

Spring MVC 多個攔截器的執行順序

一、流程總覽 該流程圖描述了一個多層攔截器鏈的業務處理流程&#xff0c;核心邏輯為&#xff1a; 前置攔截&#xff1a;通過 predHandler1 和 predHandler2 逐層校驗請求合法性。核心處理&#xff1a;通過校驗后執行核心業務邏輯 handler()。后置處理與清理&#xff1a;按反…

django filter 排除字段

在Django中&#xff0c;當你使用filter查詢集&#xff08;QuerySet&#xff09;時&#xff0c;通常你會根據模型的字段來過濾數據。但是&#xff0c;有時你可能想要排除某些特定的字段&#xff0c;而不是過濾這些字段。這里有幾種方法可以實現這一點&#xff1a; 使用exclude方…

ByeCode,AI無代碼開發平臺,拖拽式操作構建應用

ByeCode是什么 ByeCode 是一款先進的 AI 無代碼平臺&#xff0c;旨在幫助企業迅速創建數字名片、網站、小程序、應用程序及內部管理系統&#xff0c;無需繁雜的編碼或開發工作。ByeCode 采用直觀的可視化界面和拖拽式操作&#xff0c;使得非技術用戶能夠輕松上手。同時&#x…