線索二叉樹:C++實現

引言:

????????線索二叉樹是一種特殊的二叉樹,它可以通過線索(線索是指在二叉樹中將空指針改為指向前驅或后繼的指針)的方式將二叉樹轉化為一個線性結構,從而方便對二叉樹進行遍歷。本文將介紹如何使用C++實現線索二叉樹。

技術實現:

????????首先,我們需要定義一個結構體來表示線索二叉樹的節點。結構體中包含了節點的數據、左右子節點以及左右線索標記。

template<typename Element>
struct ThrNode
{Element data;ThrNode* lchild;ThrNode* rchild;int lTag;int rTag;
};

????????其中,lTag和rTag分別表示左右線索標記。如果lTag為0,則表示該節點的左子節點為普通子節點;如果lTag為1,則表示該節點的左子節點為前驅節點。rTag同理。

接下來,我們使用一個類來表示線索二叉樹。該類中包含了根節點以及一些方法。

template<typename Element>
class InThrBiTree
{
public:InThrBiTree();~InThrBiTree();void inOrder();
private:ThrNode<Element>* root;void createTree(ThrNode<Element>*& node);void destroyTree(ThrNode<Element>* node);ThrNode<Element>* first(ThrNode<Element>*node);ThrNode<Element>* next(ThrNode<Element>* node);void createInThread(ThrNode<Element>*& node, ThrNode<Element>*& pre);
};

????????其中,createTree方法用于創建線索二叉樹,destroyTree方法用于銷毀線索二叉樹,inOrder方法用于中序遍歷線索二叉樹。first方法用于找到中序遍歷的第一個節點,next方法用于找到中序遍歷中的下一個節點。createInThread方法用于創建中序遍歷的線索。

接下來看怎么實現:

template<typename Element>
InThrBiTree<Element>::InThrBiTree()
{createTree(root);ThrNode<Element>* pre = nullptr;if (root != nullptr){createInThread(root, pre);pre->rTag = 1;}
}template<typename Element>
InThrBiTree<Element>::~InThrBiTree()
{destroyTree(node);
}template<typename Element>
void InThrBiTree<Element>::inOrder()
{ThrNode<Element>* p = first(p);while (p != nullptr) {cout << p->data << " ";p = next(p);}cout << endl;
}template<typename Element>
void InThrBiTree<Element>::createTree(ThrNode<Element>*& node)
{char item;cin >> item;if (item == '#')node = nullptr;else {node = new BiNode<Element>;node->data = item;createTree(node->lchild);createTree(node->rchild);}
}template<typename Element>
void InThrBiTree<Element>::destroyTree(ThrNode<Element>* node)
{if(node!=nullptr){destroyTree(node->lchild);destroyTree(node->rchild);delete node;}
}template<typename Element>
ThrNode<Element>* InThrBiTree<Element>::first(ThrNode<Element>* node)
{ThrNode<Element>* p = node;while (p->lTag == 0)p = p->lchild;return p;
}template<typename Element>
ThrNode<Element>* InThrBiTree<Element>::next(ThrNode<Element>* node)
{ThrNode<Element>* p = node->rchild;if (node->rTag == 1) {return p;}else {return first(p);}
}template<typename Element>
inline void InThrBiTree<Element>::createInThread(ThrNode<Element>*& node, ThrNode<Element>*& pre)
{if (node == nullptr) return;createInThread(node->lchild, pre);if (node->lchild == nullptr){node->lchild = pre;node->lTag = 1;}if (pre != nullptr && pre->rchild == nullptr){pre->rchild = node;pre->rTag = 1;}pre = node;createInThread(node->rchild, pre);
}

最后,我們來看一下如何使用該類來創建和遍歷線索二叉樹。

int main()
{InThrBiTree<int> tree;tree.createTree(tree.root);tree.createInThread(tree.root, nullptr);tree.inOrder();tree.destroyTree(tree.root);return 0;
}

????????首先創建一個InThrBiTree對象,然后調用createTree方法創建線索二叉樹,接著調用createInThread方法創建中序遍歷的線索,最后調用inOrder方法中序遍歷線索二叉樹。最后,調用destroyTree方法銷毀線索二叉樹。?

結尾:

????????以上就是使用C++實現線索二叉樹的方法。線索二叉樹是一種非常實用的數據結構,它可以方便地對二叉樹進行遍歷。通過本文的介紹,相信讀者已經掌握了如何使用C++實現線索二叉樹的方法。

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

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

相關文章

安全地公網訪問樹莓派等設備的服務 內網穿透--frp 23年11月方法

如果想要樹莓派可以被公網訪問&#xff0c;可以選擇直接網上搜內網穿透提供商&#xff0c;一個月大概10塊錢&#xff0c;也有免費的&#xff0c;但是免費的速度就不要希望很好了。 也可以選擇接下來介紹的frp&#xff0c;這種方式不需要付費&#xff0c;但是需要你有一臺有著公…

vue3自定義拖拽指令

<template><div v-move class"box"></div> </template><script setup lang"ts"> import { Directive } from vue const vMove:Directive (el:HTMLElement) >{const mousedown (e:MouseEvent) >{// 鼠標按下const s…

【Golang】解決使用interface{}解析json數字會變成科學計數法的問題

在使用解析json結構體的時候&#xff0c;使用interface{}接數字會發現變成了科學計數法格式的數字&#xff0c;不符合實際場景的使用要求。 舉例代碼如下&#xff1a; type JsonUnmStruct struct {Id interface{} json:"id"Name string json:"name"…

Linux 的性能調優的思路

Linux操作系統是一個開源產品&#xff0c;也是一個開源軟件的實踐和應用平臺&#xff0c;在這個平臺下有無數的開源軟件支撐&#xff0c;我們常見的apache、tomcat、mysql等。 開源軟件的最大理念是自由、開放&#xff0c;那么Linux作為一個開源平臺&#xff0c;最終要實現的是…

Java反射調用kotlin中的類,Object類,Companion對

Java反射調用kotlin中的類&#xff0c;Object類&#xff0c;Companion對象 1. Java反射調用kotlin中的普通類 kotlin普通類&#xff1a; package com.common; class TestNormal {fun get():String{return "Nolmal abc"}fun showNum(v:Int){println("Nolmal s…

uniApp微信支付實現

后端&#xff1a;小程序下單 - 小程序支付 | 微信支付商戶文檔中心 服務端需要請求&#xff1a;https://api.mch.weixin.qq.com該地址獲取微信支付Api接口需要的參數。 服務端請求接口需要的Body參數&#xff1a; 客戶端&#xff08;前端&#xff09;需要調用&#xff1a;wx.…

12V降3.3V100mA穩壓芯片WT7133

12V降3.3V100mA穩壓芯片WT7133 WT71XX系列是一款采用CMOS工藝實現的三端高輸入電壓、低壓差、小輸出電流電壓穩壓器。 它的輸出電流可達到100mA&#xff0c;輸入電壓可達到18V。其固定輸出電壓的范圍是2.5V&#xff5e;8.0V&#xff0c;用戶 也可通過外圍應用電路來實現可變電壓…

加載minio中存儲的靜態文件html,不顯示樣式與js

問題描述:點擊鏈接獲取的就是純靜態文件,但是通過瀏覽器可以看到明明加載了css文件與js文件 原因:仔細看你會發現加載css文件顯示的contentType:text/html文件,原來是minio上傳文件時將所有文件的contentType設置成了text/html 要在上傳時指定文件,根據文章的類型指定的Conten…

css 固定按鈕到頁面頂部或者底部的實現方式

實現方式 要將按鈕固定到頂部或底部&#xff0c;可以使用CSS的定位屬性來實現。下面是一種常用的方法&#xff1a; 創建一個包含按鈕的HTML元素&#xff0c;例如一個<div>元素。確保給它添加一個唯一的id&#xff0c;以便在CSS中進行定位。 <div id"myButton&qu…

從二極管到linux服務器

軟件設計: os: 批處理系統: 輪詢系統:單片機裸機開發 實時系統:ucosii,rtos,rt-thread、風和系統、liteos(主要是海思系列soc在用)等 非實時系統:linux 對os任務切換時寄存器的功能有理解。 對ipc機制有理解。 bsp: 需要對寄存器、單片機內部總線、iic、spi、uart、c…

win10開機黑屏只有鼠標?這份指南幫你輕松解決!

win10是一個出色的操作系統&#xff0c;但有時用戶可能會遇到開機后只有鼠標顯示在屏幕上的問題&#xff0c;這種情況可能會讓人感到困惑和沮喪。在本文中&#xff0c;我們將介紹三種解決win10開機黑屏只有鼠標的方法&#xff0c;以幫助您快速恢復正常的桌面環境。 方法1&#…

Ubuntu18.4中安裝wkhtmltopdf + Odoo16配置【二】

deepin Linux 安裝wkhtmltopdf 1、先從官網的鏈接里下載linux對應的包 wkhtmltopdf/wkhtmltopdf 下載需要的版本&#xff0c;推薦版本&#xff0c;新測有效&#xff1a; wkhtmltox-0.12.4_linux-generic-amd64.tar.xz 2、解壓下載的文件 解壓后會有一個wkhtmltox文件夾 3…

CTA-GAN:基于生成對抗性網絡的主動脈和頸動脈非集中CT血管造影 CT到增強CT的合成技術

Generative Adversarial Network–based Noncontrast CT Angiography for Aorta and Carotid Arteries 基于生成對抗性網絡的主動脈和頸動脈非集中CT血管造影背景貢獻實驗方法損失函數Thinking 基于生成對抗性網絡的主動脈和頸動脈非集中CT血管造影 https://github.com/ying-f…

可自行DIY單TYPE-C接口設備實現DRP+OTG功能芯片

隨著USB-C接口的普及&#xff0c;歐盟的法律法規強制越來越多的設備開始采用這種接口。由于 USB-C接口的高效性和便攜性&#xff0c;使各種設備之間的連接和數據傳輸變得非常方便快捷&#xff0c;它們不僅提供了強大的功能&#xff0c;還為我們的日常生活和工作帶來了極大的便利…

Python與設計模式--代理模式

5-Python與設計模式–代理模式 一、網絡服務器配置白名單 代理模式是一種使用頻率非常高的模式&#xff0c;在多個著名的開源軟件和當前多個著名的互聯網產品后 臺程序中都有所應用。下面我們用一個抽象化的簡單例子&#xff0c;來說明代理模式。 首先&#xff0c;構造一個網絡…

ssm+vue的企業文檔管理系統(有報告)。Javaee項目,ssm vue前后端分離項目。

演示視頻&#xff1a; ssmvue的企業文檔管理系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;ssm vue前后端分離項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&…

Talk | 牛津大學博士后研究員邊佳旺:SC-DepthV3-動態場景中的自監督單目深度估計

本期為TechBeat人工智能社區第550期線上Talk。 北京時間11月23日(周四)20:00&#xff0c;牛津大學博士后研究員—邊佳旺的Talk已準時在TechBeat人工智能社區開播&#xff01; 他與大家分享的主題是: “SC-DepthV3&#xff1a;動態場景中的自監督單目深度估計”&#xff0c;介紹…

Vocoder,聲碼器詳解——語音信號處理學習(十)

參考文獻&#xff1a; [1] Vocoder (由助教許博竣同學講授)嗶哩嗶哩bilibili [2] Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. arXiv preprint arXiv:1609.03499, 2016. [3] https://deepmind.com/blog/article/wavenet-generative-mode…

【華為OD機試題】 給出一個區間的集合,請合并所有重疊的區間。

給出一個區間的集合&#xff0c;請合并所有重疊的區間。 示例 1: 輸入: [[1,3],[2,6],[8,10],[15,18]] #輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6]. 示例 2: #輸入: [[1,4],[4,5]] #輸出: [[1,5]] #解釋: 區間 [1,4] 和 [4,5] 可被視…

window.requestAnimationFrame+localStorage+canvas實現跨窗口小球連線效果

文章目錄 前言效果代碼后言 前言 hello world歡迎來到前端的新世界 &#x1f61c;當前文章系列專欄&#xff1a;前端系列文章 &#x1f431;?&#x1f453;博主在前端領域還有很多知識和技術需要掌握&#xff0c;正在不斷努力填補技術短板。(如果出現錯誤&#xff0c;感謝大家…