數據結構6 · BinaryTree二叉樹模板

代碼函數功能順序如下:

1:destroy:遞歸刪除樹

2:copy:復制二叉樹

3:preOrder:遞歸前序遍歷

4:inOrder:遞歸中序遍歷

5:postOrder:遞歸后續遍歷

6:levelOrder:BFS層序遍歷

7:mergeTrees:合并樹

8:getRoot:獲取根節點

#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{int val;		 // 節點值TreeNode *left;	 // 左子樹TreeNode *right; // 右子樹TreeNode(int x)	 // 構造函數{val = x;left = nullptr;right = nullptr;}
};
// class定義類
class BinaryTree
{
private:TreeNode *root; // 定義根節點,根節點是私有的,外部不能直接訪問// 遞歸刪除樹void destroy(TreeNode *node) // 參數是正在處理的二叉樹結點{if (node) // 在節點存在(不為空)的情況下{destroy(node->left);  // 遞歸刪除左子樹destroy(node->right); // 遞歸刪除右子樹delete node;		  // 刪除當前節點}}// 遞歸復制二叉樹TreeNode *copy(TreeNode *node) // 輸入原二叉樹的某個結點指針// 返回復制后的新二叉樹對應節點指針{if (!node){return nullptr;}TreeNode *newNode = new TreeNode(node->val);newNode->left = copy(node->left);newNode->right = copy(node->right);return newNode;}public:BinaryTree() : root(nullptr) {}// 構造函數,初始化根節點為空// 遞歸前序遍歷void preOrder(TreeNode *node = nullptr){if (!node) // 如果當前是空節點,則返回{// 如果當前節點為空,停止遞歸if (!root){return;}node = root; // 如果當前節點不為空,則將當前節點設為根節點}cout << node->val << " "; // 輸出當前節點值if (node->left){preOrder(node->left); // 遞歸遍歷左子樹}if (node->right){preOrder(node->right); // 遞歸遍歷右子樹}}// 遞歸中序遍歷void inOrder(TreeNode *node = nullptr){if (!node){if (!root){return;}node = root;}if (node->left){inOrder(node->left);}cout << node->val << " ";if (node->right){inOrder(node->right);}}// 遞歸后序遍歷void postOrder(TreeNode *node = nullptr){if (!node){if (!root){return;}node = root;}if (node->left){postOrder(node->left);}if (node->right){postOrder(node->right);}cout << node->val << " ";}// 層序遍歷(BFS)void levelOrder(const vector<int> &nodes) // 參數用來存儲二叉樹的層序遍歷序列{if (nodes.empty() || nodes[0] == -1){root = nullptr;return;}root = new TreeNode(nodes[0]);// 根節點是第一個元素queue<TreeNode *> q;// 使用隊列進行層序遍歷q.push(root);// 放入第一個元素int i = 1;while (!q.empty() && i < nodes.size()){TreeNode *current = q.front();// 獲取當前節點,起名為currentq.pop(); // 彈出隊頭if (i < nodes.size() && nodes[i] != -1){ // 如果當前節點有左子樹current->left = new TreeNode(nodes[i]);// 創建左子樹,值為nodes[i]q.push(current->left);// 將左子樹放入隊列}i++; // i指向下一個元素// 右子樹同理if (i < nodes.size() && nodes[i] != -1){current->right = new TreeNode(nodes[i]);q.push(current->right);}i++;}}// 合并兩棵樹// void,直接修改當前數的值,把他與other合并// other樹會清空(root指針被設為nullptr)void mergeTrees(BinaryTree &other, int mergeValue){// 參數other是另一個二叉樹,mergeValue是合并后的新根節點的值if (!root){root = other.root;	  // 如果當前樹為空,直接將other樹賦值給當前樹other.root = nullptr; // other樹清空return;}TreeNode *newRoot = new TreeNode(mergeValue);// 創建新根節點,值為mergeValue,作為合并后的根節點newRoot->left = root;// 新根節點的左子樹為當前樹的根節點newRoot->right = other.root;// 新根節點的右子樹為other樹的根節點root = newRoot;// 將新根節點賦值給當前樹的根節點other.root = nullptr;//	other樹清空}// 析構函數~BinaryTree() { destroy(root); } // 析構函數,刪除樹// 獲取根節點TreeNode *getRoot() { return root; } // 獲取根節點
};
int main()
{// 測試1: 構造空樹BinaryTree emptyTree;cout << "Empty tree pre-order: ";emptyTree.preOrder(); // 應無輸出cout << endl;// 測試2: 從層序遍歷數組構造二叉樹vector<int> nodes1 = {1, 2, 3, -1, 4, 5, 6}; // -1表示空節點BinaryTree tree1;tree1.levelOrder(nodes1); // 構建樹cout << "Tree1 Pre-order(recursive): ";tree1.preOrder();cout << endl;cout << "Tree1 In-order(recursive): ";tree1.inOrder();cout << endl;cout << "Tree1 Post-order(recursive): ";tree1.postOrder();cout << endl;// 測試3: 復制構造函數BinaryTree tree2;tree2.levelOrder({10, 11, 12, 13, -1, 14}); // 構建另一棵樹cout << "\nTree2 Level-order built: 10,11,12,13,-1,14" << endl;cout << "Tree2 Pre-order: ";tree2.preOrder();cout << endl;// 測試4: 合并兩棵樹cout << "\nMerging Tree1 and Tree2 with new root value 100..." << endl;tree1.mergeTrees(tree2, 100);cout << "Merged Tree Pre-order: ";tree1.preOrder(); // 應顯示: 100 1 2 4 3 5 6 10 11 13 12 14cout << endl;// 測試5: 檢查tree2是否被清空cout << "\nTree2 after merging (should be empty): ";tree2.preOrder(); // 應無輸出cout << endl;// 測試6: 析構函數(自動調用,無需顯式測試)cout << "\nAll trees will be automatically destroyed when exiting main()" << endl;return 0;
}

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

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

相關文章

C++/SDL進階游戲開發 —— 雙人塔防游戲(代號:村莊保衛戰 13)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄 十…

強化學習之基于無模型的算法之時序差分法

2、時序差分法(TD) 核心思想 TD 方法通過 引導值估計來學習最優策略。它利用當前的估計值和下一個時間步的信息來更新價值函數&#xff0c; 這種方法被稱為“引導”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡羅方法那樣等待一個完整的 episode 結束才進行更新&…

AE/PR模板 100個現代文字標題動態排版效果動畫 Motion Titles

Motion Titles是一個令人驚艷的AE/PR模板&#xff0c;提供了100個現代文字標題的動態排版效果動畫。這些動畫效果能夠為你的項目增添視覺沖擊力和專業感&#xff0c;為文字標題注入活力和動感。該模板適用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…

【AI提示詞】二八法則專家

提示說明 精通二八法則&#xff08;帕累托法則&#xff09;的廣泛應用&#xff0c;擅長將其應用于商業、管理、個人發展等領域&#xff0c;深入理解其在不同場景中的具體表現和實際意義。 提示詞 # Role: 二八法則專家## Profile - language: 中文 - description: 精通二八法…

前端八股 CSS 1

盒子模型 進行布局時將所有元素表示為一個個盒子box padding margin border content content&#xff1a;盒子內容 待顯示的文本和圖像 padding&#xff1a;內邊距&#xff0c;內容和border之間的空間&#xff0c;不能為負數&#xff0c;受bkc影響 border:邊框&#xff0c…

組件通信-$attrs

概述&#xff1a;$attrs用于實現當前組件的父組件&#xff0c;向當前組件的子組件通信&#xff08;爺→孫&#xff09;。 具體說明&#xff1a;$attrs是一個對象&#xff0c;包含所有父組件傳入的標簽屬性。 注意&#xff1a;$attrs會自動排除props中聲明的屬性(可以認為聲明過…

jdk開啟https詳細步驟

要在 JDK 中啟用 HTTPS&#xff0c;您可以按照以下詳細步驟進行操作&#xff1a; 生成密鑰庫和證書&#xff1a; 首先&#xff0c;您需要生成一個密鑰庫&#xff08;keystore&#xff09;和證書&#xff0c;可以使用 keytool 工具來生成。以下是使用 keytool 生成密鑰庫和證書的…

文章四《深度學習核心概念與框架入門》

文章4&#xff1a;深度學習核心概念與框架入門——從大腦神經元到手寫數字識別的奇幻之旅 引言&#xff1a;給大腦裝個"GPU加速器"&#xff1f; 想象一下&#xff0c;你的大腦如果能像智能手機的GPU一樣快速處理信息會怎樣&#xff1f;這正是深度學習的終極目標&…

關于CSDN創作的常用模板內容

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 好文評論新文推送 &#x1f4c3;文章前言 &…

linux的信號量初識

Linux下的信號量(Semaphore)深度解析 在多線程或多進程并發編程的領域中&#xff0c;確保對共享資源的安全訪問和協調不同執行單元的同步至關重要。信號量&#xff08;Semaphore&#xff09;作為經典的同步原語之一&#xff0c;在 Linux 系統中扮演著核心角色。本文將深入探討…

《Android 應用開發基礎教程》——第十一章:Android 中的圖片加載與緩存(Glide 使用詳解)

目錄 第十一章&#xff1a;Android 中的圖片加載與緩存&#xff08;Glide 使用詳解&#xff09; &#x1f539; 11.1 Glide 簡介 &#x1f538; 11.2 添加 Glide 依賴 &#x1f538; 11.3 基本用法 ? 加載網絡圖片到 ImageView&#xff1a; ? 加載本地資源 / 文件 / UR…

AE模板 300個故障干擾損壞字幕條標題動畫視頻轉場預設

這個AE模板提供了300個故障干擾損壞字幕條標題動畫視頻轉場預設&#xff0c;讓您的視頻具有炫酷的故障效果。無論是預告片、宣傳片還是其他類型的視頻&#xff0c;這個模板都能帶給您令人驚嘆的故障運動標題效果。該模板無需任何外置插件或腳本&#xff0c;只需一鍵點擊即可應用…

在 Python 中,以雙下劃線開頭和結尾的函數(如 `__str__`、`__sub__` 等)

在 Python 中&#xff0c;以雙下劃線開頭和結尾的函數&#xff08;如 __str__、__sub__ 等&#xff09;被稱為特殊方法&#xff08;Special Methods&#xff09;或魔術方法&#xff08;Magic Methods&#xff09;。它們確實是 Python 內置的&#xff0c;用于定義類的行為&#…

git問題記錄-如何切換歷史提交分支,且保留本地修改

問題記錄 我在本地編寫了代碼&#xff0c;突然想查看之前提交的代碼&#xff0c;并且想保留當前所在分支所做的修改 通過git stash對本地的代碼進行暫存 使用git checkout <commit-hash>切換到之前的提交記錄。 查看完之后我想切換回來&#xff0c;恢復暫存的本地代碼…

Github開通第三方平臺OAuth登錄及Java對接步驟

調研起因&#xff1a; 準備搞AI Agent海外項目&#xff0c;有相當一部分用戶群體是程序員&#xff0c;所以當然要接入Github這個全球最大的同性交友網站了&#xff0c;讓用戶使用Github賬號一鍵完成注冊或登錄。 本教程基于Web H5界面進行對接&#xff0c;同時也提供了spring-…

期刊、出版社、索引數據庫

image 1、研究人員向期刊或者會議投稿&#xff0c;交注冊費和相應的審稿費等相關費用[1]&#xff1b; 2、會議組織者和期刊聯系出版社&#xff0c;交出版費用&#xff1b; 3、出版社將論文更新到自己的數據庫中&#xff0c;然后將數據庫賣給全世界各大高校或企業&#xff1b; 4…

Transformer 模型及深度學習技術應用

近年來&#xff0c;隨著卷積神經網絡&#xff08;CNN&#xff09;等深度學習技術的飛速發展&#xff0c;人工智能迎來了第三次發展浪潮&#xff0c;AI技術在各行各業中的應用日益廣泛。 注意力機制&#xff1a;理解其在現代深度學習中的關鍵作用&#xff1b; Transformer模型…

zynq7035的arm一秒鐘最多可以支持觸發多少次中斷

一、概述 1.關于zynq7035的ARM處理器一秒能夠支持多少次中斷觸發&#xff0c;需要綜合來考慮。需要確定ARM處理器的參數&#xff0c;目前zynq7000系列&#xff0c;使用的雙核Cortex-A9處理器。其中主頻大概在500MHZ~1GHZ左右&#xff0c;不同的用戶配置的主頻可能稍微有差別。 …

數據結構與算法:圖論——最短路徑

最短路徑 先給出一些leetcode算法題&#xff0c;以后遇見了相關題目再往上增加 最短路徑的4個常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同應用場景下&#xff0c;應有選擇地使用它們&#xff1a; 圖的規模小&#xff0c;用Floyd。若邊的權值有負數&#xff0c;需要…

[android]MT6835 Android 關閉selinux方法

Selinux SELinux is an optional feature of the Linux kernel that provides support to enforce access control security policies to enforce MAC. It is based on the LSM framework. Working with SELinux on Android – LineageOS Android 關閉selinux MT6835 Android…