先序二叉樹的線索化,并找指定結點的先序后繼

#include<stdio.h>
#include<stdlib.h>
#define elemType char
//線索二叉樹結點?
typedef struct ThreadNode{
?? ?elemType data;
?? ?struct ThreadNode *lchild,*rchild;
?? ?int ltag,rtag;//用來判斷一個結點是否有線索?
}ThreadNode,*ThreadTree;
//全局變量pre,指向當前結點的前驅
ThreadNode* pre=NULL;?
//初始化一顆二叉樹?
bool initTree(ThreadNode** root,elemType data){
?? ?*root=(ThreadNode*)malloc(sizeof(ThreadNode));
?? ?if((*root)==NULL){
?? ??? ?return false;
?? ?}
?? ?(*root)->data=data;
?? ?(*root)->lchild=NULL;
?? ?(*root)->rchild=NULL;
?? ?(*root)->ltag=0;
?? ?(*root)->rtag=0;
?? ?return true;
}
//回收動態開辟的內存?
void destroyTree(ThreadNode* root){
?? ?if(root!=NULL){
?? ??? ?if(root->ltag==0){//確保其左孩子不是線索?
?? ??? ??? ?destroyTree(root->lchild);
?? ??? ?}
?? ??? ?if(root->rtag==0){//確保其右孩子不是線索?
?? ??? ??? ?destroyTree(root->rchild);
?? ??? ?}
?? ??? ?free(root);
?? ?}
}
//給指定結點增添左孩子
bool addLeftNode(ThreadNode* curRoot,elemType data){
?? ?ThreadNode* addNode=(ThreadNode*)malloc(sizeof(ThreadNode));
?? ?if(addNode==NULL){
?? ??? ?return false;
?? ?}
?? ?addNode->data=data;
?? ?addNode->lchild=NULL;
?? ?addNode->rchild=NULL;
?? ?addNode->ltag=0;
?? ?addNode->rtag=0;
?? ?curRoot->lchild=addNode;
?? ?return true;
}
//給指定結點增添右孩子
bool addRightNode(ThreadNode* curRoot,elemType data){
?? ?ThreadNode* addNode=(ThreadNode*)malloc(sizeof(ThreadNode));
?? ?if(addNode==NULL){
?? ??? ?return false;
?? ?}
?? ?addNode->data=data;
?? ?addNode->lchild=NULL;
?? ?addNode->rchild=NULL;
?? ?addNode->ltag=0;
?? ?addNode->rtag=0;
?? ?curRoot->rchild=addNode;
?? ?return true;
}
//先序遍歷?
void preOrder(ThreadNode* curRoot){
?? ?if(curRoot!=NULL){
?? ??? ?printf("%c ",curRoot->data);
?? ??? ?preOrder(curRoot->lchild);
?? ??? ?preOrder(curRoot->rchild);
?? ?}
}
void visit(ThreadNode* p){
?? ?if(p->lchild==NULL){
?? ??? ?p->lchild=pre;
?? ??? ?p->ltag=1;
?? ?}
?? ?if(pre!=NULL&&pre->rchild==NULL){
?? ??? ?pre->rchild=p;
?? ??? ?pre->rtag=1;
?? ?}
?? ?pre=p;
}
//先序遍歷二叉樹,一邊遍歷一邊線索化
void preThread(ThreadTree T){
?? ?if(T!=NULL){
?? ??? ?visit(T);//先處理根節點?
?? ??? ?if(T->ltag==0){//確保lchild不是前驅線索,避免出現死循環?
?? ??? ??? ?preThread(T->lchild);
?? ??? ?}
?? ??? ?if(T->rtag==0){
?? ??? ??? ?preThread(T->rchild);?? ??? ??? ?
?? ??? ?}

?? ?}
}?
//先序線索化二叉樹
void createPreThread(ThreadTree T){
?? ?pre=NULL;//pre初始化為NULL?
?? ?if(T!=NULL){//非空二叉樹才能線索化?
?? ??? ?preThread(T);//先序線索化二叉樹?
?? ??? ?if(pre->rchild==NULL){
?? ??? ??? ?pre->rtag=1;//處理遍歷最后一個結點?
?? ??? ?}
?? ?}
?? ?
}
//-----------------------------------------在先序線索二叉樹中找到指定結點p的先序后繼next----------------------------------------
ThreadNode* firstAfterRoot(ThreadNode* p){
?? ?if(p!=NULL){
?? ??? ?if(p->ltag==1){//表明左指針被線索化,沒有左子樹?
?? ??? ??? ?return p->rchild;
?? ??? ?}
?? ??? ?else{
?? ??? ??? ?return p->lchild;
?? ??? ?}
?? ?}
}
ThreadNode* findPreNext(ThreadNode* p){
?? ?if(p!=NULL){
?? ??? ?if(p->rtag==0) return firstAfterRoot(p);
?? ??? ?else return p->rchild;
?? ?}
}
//-----------------------------------------在先序線索二叉樹中找到指定結點p的先序后繼next----------------------------------------

//利用先序線索二叉樹實現非遞歸先序遍歷
void PreOrder(ThreadNode* root){
?? ?for(ThreadNode* cur=root;cur!=NULL;cur=findPreNext(cur)){
?? ??? ?printf("%c ",cur->data);
?? ?}
}
int main(){
?? ?ThreadTree root;
?? ?initTree(&root,'A');
?? ?addLeftNode(root,'B');
?? ?addRightNode(root,'C');
?? ?addRightNode(root->lchild,'D');
?? ?addLeftNode(root->rchild,'E');
?? ?printf("普通的先序遍歷:\n");
?? ?preOrder(root);
?? ?printf("\n");
?? ?
?? ?createPreThread(root);
?? ?printf("非遞歸的先序遍歷:\n");
?? ?PreOrder(root);
?? ?printf("\n");
?? ?destroyTree(root);
?? ?return 0;
}

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

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

相關文章

螞蟻集團轉正實習大模型算法崗內推

1.負責以大模型為代表的A轉術能力的建設和優化&#xff0c;打造業界領先的A(技術系統&#xff0c;主要職責包括A系統結構設計、RAG 系統開發、大模型凱練數據構建、大模型能力評測、大模型準理效果和效率優化等 2.緊密跟蹤、探索大模型方向前沿技術&#xff0c;依托豐富目體系化…

未授權漏洞大賞

ActiveMQ未授權訪問漏洞 漏洞描述 Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息服務、集群、Spring Framework等。 Apache ActiveMQ管理控制臺的默認管理用戶名和密碼分別為admin和admin&am…

Python包結構與 `__init__.py` 詳解

1. 什么是 __init__.py&#xff1f; __init__.py 是Python包的標識文件&#xff0c;它告訴Python解釋器這個目錄應該被視為一個包&#xff08;Package&#xff09;。這個文件可以為空&#xff0c;也可以包含初始化代碼。 1.1 基本作用 包的標識 將普通目錄轉換為Python包允許…

Web前端開發——HTML基礎下

HTML語法 一表格1.基本格式2.美化表格合并居中屬性 二表單1.input2.select3.textarea4.button5.date6.color7.checkbox8.radio9.range10.number 一表格 1.基本格式 HTML表格由<table>標簽定義 其中行由<tr>標簽定義&#xff0c;單元格由<td>定義。我們先來…

小程序事件系統 —— 33 事件傳參 - data-*自定義數據

事件傳參&#xff1a;在觸發事件時&#xff0c;將一些數據作為參數傳遞給事件處理函數的過程&#xff0c;就是事件傳參&#xff1b; 在微信小程序中&#xff0c;我們經常會在組件上添加一些自定義數據&#xff0c;然后在事件處理函數中獲取這些自定義數據&#xff0c;從而完成…

安卓設備root檢測與隱藏手段

安卓設備root檢測與隱藏手段 引言 安卓設備的root權限為用戶提供了深度的系統控制能力&#xff0c;但也可能帶來安全風險。因此&#xff0c;許多應用&#xff08;如銀行軟件、游戲和流媒體平臺&#xff09;會主動檢測設備是否被root&#xff0c;并限制其功能。這種對抗催生了ro…

如何在Ubuntu上直接編譯Apache Doris

以下是在 Ubuntu 22.04 上直接編譯 Apache Doris 的完整流程&#xff0c;綜合多個版本和環境的最佳實踐&#xff1a; 注意&#xff1a;Ubuntu的數據盤VMware默認是20G&#xff0c;編譯不夠用&#xff0c;給到50G以上吧 一、環境準備 1. 安裝系統依賴 # 基礎構建工具鏈 apt i…

vuejs相關鏈接和格式化插件推薦

vue官網&#xff1a; https://cn.vuejs.org/ 配合路由設置&#xff1a; https://router.vuejs.org/zh/guide/ element plus (vue3) | element UI (vue2)&#xff1a; https://element-plus.org/zh-CN/#/zh-CN 構建工具vite&#xff1a; https://cn.vitejs.dev/ 右鍵選擇…

IDEA中Git版本回退終極指南:Reset與Revert雙方案詳解

目錄 前言一、版本回退前置知識二、Reset方案&#xff1a;整體改寫歷史1、IDEA圖形化操作&#xff08;推薦&#xff09;1.1、查看提交歷史1.2、選擇目標版本1.3、選擇回退模式1.3.1、Soft&#xff08;推薦&#xff09;1.3.2、Mixed1.3.3、Hard&#xff08;慎用&#xff09;1.3.…

PHP并發請求優化:使用`curl_multi_select()`實現高效的多請求處理

PHP并發請求優化&#xff1a;使用curl_multi_select()實現高效的多請求處理 背景 最近在項目中遇到一個需求&#xff0c;需要從多個 1 級網站&#xff08;超過 200 個&#xff09;獲取數據&#xff0c;并且是通過 POST 請求瞬間發送到這些網站上。開始時我直接使用了 curl_ex…

【leetcode hot 100 206】反轉鏈表

解法一&#xff1a;&#xff08;頭插法&#xff09;在遍歷鏈表時&#xff0c;將當前節點的 next 指針改為指向前一個節點。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…

【QT】-易錯點筆記-2025-2-7

1,QList<phy_simulator*> pList;為空不能append()追加,要先new,再用 QList<phy_simulator> pList為空時,確實不能調用 append() 方法。原因很簡單,QList 是一個類對象,在 C++ 中,指針本身并不代表它指向的對象。因此,當你有一個指向 QList<phy_simulato…

AI-Deepseek + PPT

01--Deepseek提問 首先去Deepseek問一個問題&#xff1a; Deepseek的回答&#xff1a; 在汽車CAN總線通信中&#xff0c;DBC文件里的信號處理&#xff08;如初始值、系數、偏移&#xff09;主要是為了 將原始二進制數據轉換為實際物理值&#xff0c;確保不同電子控制單元&…

實驗一:在Windows 10/11下配置和管理TCP/IP

目錄 1.【實訓目標】 2.【實訓環境】 3.【實訓內容】 4.【實訓步驟】 1.【實訓目標】 1.了解網絡基本配置中包含的協議、服務、客戶端。 2.了解Windows支持的網絡協議及參數設置方法。 3.掌握TCP/IP協議的配置。 2.【實訓環境】 硬件環境&#xff1a;每人一臺計算機&a…

Java直通車系列14【Spring MVC】(深入學習 Controller 編寫)

目錄 基本概念 編寫 Controller 的步驟和要點 1. 定義 Controller 類 2. 映射請求 3. 處理請求參數 4. 調用業務邏輯 5. 返回響應 場景示例 1. 簡單的 Hello World 示例 2. 處理路徑變量和請求參數 3. 處理表單提交 4. 處理 JSON 數據 5. 異常處理 基本概念 Cont…

EA - 開源工程的編譯

文章目錄 EA - 開源工程的編譯概述筆記環境備注x86版本EABase_x86EAAssert_x86EAThread_x86修改 eathread_atomic_standalone_msvc.h原始修改后 EAStdC_x86EASTL_x86EAMain_x86EATest_x86備注備注END EA - 開源工程的編譯 概述 EA開源了‘命令與征服’的游戲源碼 嘗試編譯. 首…

一招解決Pytorch GPU版本安裝慢的問題

Pytorch是一個流行的深度學習框架&#xff0c;廣泛應用于計算機視覺、自然語言處理等領域。安裝Pytorch GPU版本可以充分利用GPU的并行計算能力&#xff0c;加速模型的訓練和推理過程。接下來&#xff0c;我們將詳細介紹如何在Windows操作系統上安裝Pytorch GPU版本。 查看是否…

為解決局域網IP、DNS切換的Windows BAT腳本

一、背景 為解決公司普通人員需要切換IP、DNS的情況&#xff0c;于是搞了個windows下的bat腳本&#xff0c;可以對有線網絡、無線網絡進行切換設置。 腳本內容 echo off title 多網絡接口IP切換工具:menu cls echo echo 請選擇要配置的網絡接口: echo echo 1. 有線網絡&am…

uni_app實現下拉刷新

1. 在頁面配置中啟用下拉刷新 首先&#xff0c;你需要在頁面的 pages.json 文件中啟用下拉刷新功能。 {"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首頁","enablePull…

OpenCV計算攝影學(14)實現對比度保留去色(Contrast Preserving Decolorization)的函數decolor()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將彩色圖像轉換為灰度圖像。它是數字印刷、風格化的黑白照片渲染&#xff0c;以及許多單通道圖像處理應用中的基本工具。 cv::decolor 是 OpenCV…