【(Topk問題及其二叉樹遍歷】

Topk問題及其二叉樹遍歷

  • 1.Topk問題
  • 2.二叉樹的前序,中序,后序
  • 3.求二叉樹的個數(TreeSize)。
  • 4.求二叉樹的最大深度(maxDepth)。
  • 5.求二叉樹的第K層的節點個數(TreeKLevel)。
  • 6.查找二叉樹的節點(FindNode)。
  • 7.判斷兩棵樹是否相同(isSameTree)。

1.Topk問題

?TOP-K問題:即求數據結合中前K個最大的元素或者最小的元素,一般情況下數據量都比較大。
?1.用數據集合中前K個元素來建堆。
?前k個最大的元素,則建小堆
?前k個最小的元素,則建大堆

Alt

?思路解答:假設求1億個數中,前10個最大值。則建成10個數的小堆,剩余數與堆頭數據比較,若比堆頭數據大,則交換,向下調整成堆,小一點的數又排到對頭,進行篩選,相當于建立了一個裝載10個數的漏斗,進行篩選。

void CreatData()
{// 造數據int n = 100000;srand((unsigned int)time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; ++i){int x = (rand() + i) % 1000000;fprintf(fin, "%d\n", x);}fclose(fin);
}void topk()
{printf("請輸入k:>");int k = 0;scanf("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);}// 建k個數據的小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(minheap, k, i);}int x = 0;while (fscanf(fout, "%d", &x) != EOF){// 讀取剩余數據,比堆頂的值大,就替換他進堆if (x > minheap[0]){minheap[0] = x;AdjustDown(minheap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", minheap[i]);}fclose(fout);}

?時間復雜度:建立K個數的堆,建堆時間復雜度:O(k),向下調整整成堆的時間復雜度:(N-k)* log ? 2 k . , \log_2 k., log2?k.,則,合起來就是O(N) = O(k+(N-k) * log ? 2 k \log_2 k log2?k )。

2.二叉樹的前序,中序,后序

? 二叉樹的遍歷,因為樹不是線性結構,可以劃分成子問題來求解,根據遞歸先后順序不同,可以分為以下三種遍歷順序。
??前序:根、左子樹、右子樹
??中序:左子樹、根、右子樹
??后序:左子樹、右子樹、根
Alt
?再次說明一下,二叉樹數是要依靠遞歸遍歷的,根據遍歷的順序不同,分為三種情況。
?上面二叉樹的前序遍歷如下。
1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL
?代碼如下:

typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;int val;
}BTNode;BTNode* BuyNode(int x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->left = newnode->right = NULL;newnode->val = x;return newnode;
}BTNode* CreatTree()
{BTNode* n1 = BuyNode(1);BTNode* n2 = BuyNode(2);BTNode* n3 = BuyNode(3);BTNode* n4 = BuyNode(4);BTNode* n5 = BuyNode(5);BTNode* n6 = BuyNode(6);n1->left = n2;n1->right = n4;n2->left = n3;n4->left = n5;n4->right = n6;return n1;
}void PreOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}

?因為是遞歸寫的,剛學習不好理解。從大的層面來講,先遍歷根,在遍歷左子樹,在遍歷右子樹。
寫好遞歸就兩個條件:
<1>遞歸子問題
<2>返回條件
上面前序的遍歷,遇到NULL就返回,因為走到頭了,先訪問根,在訪問左子樹,右子樹。就整個遍歷完了。

?遞歸展開圖如下。
Alt

?在從代碼執行的角度來理解,畫遞歸展開圖。
Alt

?中序遍歷如下:
NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL

void InOrder(BTNode* root)
{if (root == NULL){printf("NULL");return;}InOrder(root->left);printf("%d ",root->val);InOrder(root->right);
}

?后序遍歷如下:
NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1\

void PostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}

Alt

3.求二叉樹的個數(TreeSize)。

?
<1>遞歸子問題:左子樹的個數+右子樹的個數+1(本身的個數)
<2>返回條件:遇到 NULL,結束,返回0

int TreeSize(BTNode* root)
{if (root == NULL)return 0;return TreeSize(root->left) + TreeSize(root->right) + 1;
}

4.求二叉樹的最大深度(maxDepth)。

?
<1>遞歸子問題:左子樹的高度和右子樹的高度比較,取最大的,然后加自身的高度。(本身的個數)
<2>返回條件:遇到 NULL,結束,返回0

int  maxDepth(BTNode* root)
{if (root == NULL )return 0;int LeftDepth = maxDepth(root->left);int RightDepth = maxDepth(root->right);return LeftDepth > RightDepth ? LeftDepth + 1 : RightDepth + 1;
}

5.求二叉樹的第K層的節點個數(TreeKLevel)。

?
<1>遞歸子問題:當前的第k層的個數 = 左子樹的k-1層個數+右子樹的k-1層個數
<2>返回條件:遇到NULL 返回0;不為NULL,k== 1,則就是要找的這一層的節點,返回1。

int TreeKLevel(BTNode* root,int k)
{if (root == NULL)return 0;if (k == 1)return 1;return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

6.查找二叉樹的節點(FindNode)。

?
<1>遞歸子問題:先去左子樹找,找不到,再去右子樹找
<2>返回條件:為NULL,返回,NULL;找到,則返回節點地址。

BTNode* TreeFind(BTNode* root,int x)
{if (root == NULL)return NULL;if (root->val == x)return root;//找節點BTNode* leftNode = TreeFind(root->left, x);if (leftNode)return leftNode;BTNode* rightNode = TreeFind(root->right, x);if (rightNode)return rightNode;return NULL;
}

?這個問題比上面的遞歸復雜一些,畫遞歸展開圖來理解找到錢目標值,怎么一步一步返回上去。
Alt

7.判斷兩棵樹是否相同(isSameTree)。

?
<1>遞歸子問題:比較根,左,右子樹是否相同
<2>返回條件:兩棵樹,同時遍歷,都為NULL,True;其中一個不為NULL,false,兩個比較的數不相等,直接false.

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL)return true;if(p == NULL || q == NULL)return false;if(p->val != q->val)return false;return isSameTree(p->right,q->right) && isSameTree(p->left,q->left);
}

?完結! ?

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

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

相關文章

AI+實時計算如何賦能金融系統?DolphinDB 在國泰君安期貨年度中期策略會的演講

6月25日&#xff0c;國泰君安期貨2025年度中期策略會在上海順利開幕。本次策略會以“觀勢明變&#xff0c;本固枝榮”為主題&#xff0c;特邀15位重量級行業嘉賓和52位明星分析師發表精彩觀點&#xff0c;DolphinDB 受邀出席會議并作主題演講。 實時計算如何賦能量化投研交易 …

PHP Protobuf 手寫生成器,

? 以下是一個純 PHP 編寫的通用 Protobuf 二進制生成器&#xff0c;支持&#xff1a; varint fixed32 fixed64 length-delimited&#xff08;如字符串、嵌套 message&#xff09; 嵌套結構 (nested) 多字段 repeated ? 封裝器代碼&#xff08;可直接用&#xff09; &…

喜訊 | Mediatom斬獲2025第十三屆TopDigital創新營銷獎「年度程序化廣告平臺」殊榮

6月27日&#xff0c;2025第十三屆TopDigital創新營銷盛典在上海圓滿落幕&#xff0c;TopDigital創新營銷獎獲獎結果也已正式揭曉。本屆TopDigital創新營銷獎共有694家參展企業&#xff0c;3326件案例&#xff0c;AdMergeX旗下Mediatom媒體變現SaaS及服務平臺在眾多作品中脫穎而…

SQL 中 EXISTS 的原理與作用詳解

平常也一直在用EXISTS 來進行邏輯判斷&#xff0c;但是從來沒有正經理解它&#xff0c;只知道找到有就返回True&#xff0c;沒有就返回False。那么今天詳細的理解一下&#xff08;主要借鑒了CSDN 其他博客文章&#xff0c;以及自己做的一個小例子&#xff09; 一、EXISTS是什么…

【Docker】解決:構建(docker build)或重新運行容器時,丟失apt-get update問題

一、解決&#xff1a;構建&#xff08;docker build&#xff09;或重新運行容器時&#xff0c;丟失apt-get update問題 在 Docker 容器中&#xff0c;每次構建&#xff08;docker build&#xff09;或重新運行容器時&#xff0c;默認情況下所有更改都會丟失&#xff0c;因為容…

流程管理系統方案成本評估報告(第一稿,復盤明確數據不準確,僅供參考哦)

??一、成本評估框架?? 所在制造業流程數字化轉型的成本需從??一次性投入??與??持續運營成本??兩個維度分析,并量化??直接收益??與??間接收益??。詳細評估模型初稿: ??二、成本構成與數據支撐?? ??1. 一次性投入成本?? ??項目????費用范圍…

高并發分布式鎖解決方案對比與選型指南

高并發分布式鎖解決方案對比與選型指南 在大規模分布式系統中&#xff0c;分布式鎖是確保資源互斥訪問、保證數據一致性的關鍵組件。針對不同業務場景&#xff0c;分布式鎖的實現方案多種多樣&#xff0c;各有優缺點。本文將從問題背景出發&#xff0c;對Redis原生鎖/RedLock、…

全面掌握Vue 3響應式:ref自動解包、reactive對象替換及響應式丟失問題

Vue 3的響應式系統是其最核心的特性之一&#xff0c;主要通過ref和reactive這兩個API來實現。本文將詳細介紹這兩個API的使用方法、區別以及最佳實踐。 1. ref()的基本使用 ref()用于創建一個響應式的數據引用。它可以包裝任何類型的值&#xff0c;包括基本類型和對象類型。 …

【科普】 AI大模型應用架構圖大全

AI大模型應用架構圖大全 AI大模型技術全景視圖&#xff1a; AI大模型通用技術架構圖 AI大模型通用技術架構圖 AI大模型通用技術架構圖 RAG知識庫業務架構圖 AI農業大模型技術架構圖 AI導購大模型技術架構圖 AI導購大模型技術架構圖 AI大模型合規風控管理架構圖 AI大模型合規管…

Educational Codeforces Round 180 (Rated for Div. 2) A-D題解

A. Race 題意 在一個數軸上&#xff0c;獎品可能出現在 x x x 點或 y y y 點&#xff0c;Alice 現在在 a a a 點&#xff0c;請問Bob是否存在一個點 b b b&#xff0c;使得無論獎品出現在 x x x 點還是 y y y 點&#xff0c;Bob都能比Alice先拿到&#xff08; ∣ b ?…

IPv6配置

IPv6的基本配置 構建如下圖所示的實訓拓撲&#xff0c;按如下要求完成實訓內容&#xff1a; &#xff08;1&#xff09;啟用路由器的IPv6功能&#xff1b; &#xff08;2&#xff09;配置路由器接口的IPv6地址&#xff1b; &#xff08;3&#xff09;測試兩臺路由器的連通性…

flutter項目環境升級二:從Flutter2.10.5升級到3.29.3

系統:windows Android Studio:Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 Flutter SDK: Flutter3.29.3 JDK: java 17 詳細的AGP / Gradle / Kotlin / JDK版本兼容關系可以百度或者到官方文檔查詢,其他博主給的很詳細。確認好想要的版本兼容 這位大哥有對照表…

【網站內容安全檢測】之1:獲取網站所有鏈接sitemap數據

不多BB&#xff0c;直接上代碼&#xff1a; main.go package mainimport ("bufio""crypto/tls""fmt""io""net/http""net/url""os""strings""sync""time"_ "net/ht…

從零構建vue3項目(二)

Vue3項目增強配置&#xff1a;Axios封裝、鑒權與代碼掃描 1. Axios二次封裝與攔截器配置 安裝Axios npm install axios創建Axios實例 src/utils/request.js import axios from axios import { useUserStore } from /stores/user import router from /router// 創建axios實例…

哪家香港站群服務器比較好用?

面對魚龍混雜的服務商市場&#xff0c;哪家的香港站群服務器真正穩定&#xff1f;畢竟搞站群最怕的就是服務器抽風&#xff0c;輕則掉排名&#xff0c;重則客戶跑光光。今天咱就重點聊聊哪家香港站群服務器比較好用&#xff1f; 一般來說&#xff0c;在選擇香港站群服務器提供…

Python的科學計算庫NumPy(二)

5. 索引和切片 5.1 一維數組的索引和切片 import numpy as np# 一維數組索引和切片&#xff0c;跟python中的集合同樣使用 bin_list[1,2,3,4,5,6] bin_arraynp.array(bin_list) print(bin_array[3]) print(bin_array[1:4]) print(bin_array[-2:-1])5.2 多維數組的索引 # 多維…

STM32和C++ 實現配置文件導入、導出功能

一.配置文件導出功能 // 導出流程 // 1. 客戶端 → 設備:導出配置請求,例如:GetFlashData[d6fe30323454]:{ini} ,其中[]里面是設備序列號 // 2. 設備 → 客戶端:配置文件元數據(總大小、塊數量) // 3. 設備 → 客戶端:發送塊1(包含塊序號和大小) // 4. 設備 → 客戶端:…

HTTP 請求基礎知識

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言HTTP 請求方法GETPOSTPUTDELETE其他方法 HTTP 請求結構常用請求頭實際應用示例響應狀態碼 前言 HTTP (Hypertext Transfer Protocol) 是互聯網上應用最廣泛的協…

Django ORM 1. 創建模型(Model)

1. ORM介紹 什么是ORM&#xff1f; ORM&#xff0c;全稱 Object-Relational Mapping&#xff08;對象關系映射&#xff09;&#xff0c;一種通過對象操作數據庫的技術。 它的核心思想是&#xff1a;我們不直接寫 SQL&#xff0c;而是用 Python 對象&#xff08;類/實例&…

【C/C++】C++ 編程規范:101條規則準則與最佳實踐

C 編程規范&#xff1a;101條規則準則與最佳實踐 引言 C 是一門強大而復雜的語言&#xff0c;能高效控制硬件&#xff0c;也能寫出優雅抽象。然而&#xff0c;正因其復雜性&#xff0c;項目中若缺乏統一規范&#xff0c;極易陷入混亂、難維護、易出錯的泥潭。 本文總結了 10…