编程基础 - 线索二叉树 (Threaded Binary Tree)

线索二叉树(Threaded BinaryTree) 线索二叉树 一、写在前面    本文主要介绍了中序线索化二叉树及中序线索化二叉树遍历。前序与后序原理相似,但在前、后序线索化二叉树中查找节点的后继较容易,而查找前驱要知道其双亲的信息,前、后序线索化二叉树是不完善的。    对于n个节点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该节点的前驱节点和后继节点的指针,这些指针称为线索,加上线索的二叉树称为线索二 阅读详情

编程基础 - 线索二叉树 (Threaded Binary Tree)

返回分类:全部文章 >> 基础知识

返回上级:编程基础 - 二叉树 (Binary Tree)

本文将介绍线索二叉树的基础知识,并用C++实现它。

在查看本文之前,需要一些数据结构和程序语言的基础,要对“树”和“二叉树 (Binary Tree)”的概念有一些了解。

其中的方法还需要熟悉“栈(stack)”、“队列(queue)”和“递归”。



1 线索二叉树简述 (Introduction)

线索二叉树:假设有 n 个结点的二叉树,其中存在 n + 1 个空指针,利用这些指针存放某种遍历下的前驱和后继,这样的指针叫做线索,这样形成的二叉树叫线索二叉树。

线索二叉树分为三种:

  • 中序线索二叉树
  • 前序线索二叉树
  • 后续线索二叉树

之后的代码,我们用中序线索二叉树来举例,另外两种原理相同,不再阐述。


2 线索二叉树的结构 (Structure)

在结构中,我们左子树与右子树需要一个标签来标注存放的是左右孩子还是前驱后继。

且对于每个结点的空指针域:

  • 左子树指针空:存放前驱指针
  • 右子树指针空:存放后继指针
// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree

// 线索标签,标记指针存放的是左右孩子还是前驱后继
enum ThreadTag
{
    LeftOrRightChild = 0, // 左孩子或右孩子
    PredecessorOrSuccessor = 1 // 前驱或后继
};

// 线索二叉树节点
template<typename T>
class ThreadNode
{
    public:
    T element; // 数据
    ThreadTag leftTag; // 左标签
    ThreadTag rightTag; // 右标签
    ThreadNode<T>* leftChild; // 左指针
    ThreadNode<T>* rightChild; // 右指针

    ThreadNode(const T& e)
    {
        element = e;
        leftTag = ThreadTag::LeftOrRightChild;
        rightTag = ThreadTag::LeftOrRightChild;
        leftChild = 0;
        rightChild = 0;
    }
    ~ThreadNode()
    {
        leftChild = 0;
        rightChild = 0;
    }
};

3 为结点加入线索 (Add Thread)

初始化二叉树不再介绍,这里我们为每个结点加入线索。

由于我们需要保存前驱和后继,所以需要一个变量predNode来存储上一个结点。

而加入线索,我们需要对所有节点遍历。即,只是将二叉树的中序遍历中将访问节点(Visit)换成了加入线索。

对于每个结点的空指针域:

  • 左子树指针空:存放前驱指针
  • 右子树指针空:存放后继指针

C++代码:

  • 递归方式:

    // Author: https://blog.youkuaiyun.com/DarkRabbit
    // Threaded Binary Tree
    // 递归初始化中序遍历线索
    template<typename T>
    void InitializeInorderThread(ThreadNode<T>* node, ThreadNode<T>*& predNode)
    {
        if (node != 0)
        {
            // 左标识
            if (node->leftChild == 0)
            {
                node->leftTag = ThreadTag::PredecessorOrSuccessor;
            }
            else
            {
                node->leftTag = ThreadTag::LeftOrRightChild;
            }
    
            // 右标识
            if (node->rightChild == 0)
            {
                node->rightTag = ThreadTag::PredecessorOrSuccessor;
            }
            else
            {
                node->rightTag = ThreadTag::LeftOrRightChild;
            }
    
            InitializeInorderThread(node->leftChild, predNode); // 左子树(L)
            
            // 左子树为空,则NULL或前驱
            if (node->leftTag == ThreadTag::PredecessorOrSuccessor)
            {
                node->leftChild = predNode;
            }
    
            // 如果前驱存在,且右子树为空,则NULL或后继
            if (predNode != 0 && predNode->rightTag == ThreadTag::PredecessorOrSuccessor)
            {
                predNode->rightChild = node;
            }
    
            predNode = node;
            InitializeInorderThread(node->rightChild, predNode); // 右子树(R)
        }
    }
    
  • 非递归方式:

    // Author: https://blog.youkuaiyun.com/DarkRabbit
    // Threaded Binary Tree
    // 初始化中序遍历线索
    template<typename T>
    void InitializeInorderThread(ThreadNode<T>* root)
    {
        if (root == 0)
        {
            return;
        }
    
        std::stack<ThreadNode<T>*> nodeStack;
        ThreadNode<T>* predNode = 0;
        ThreadNode<T>* loopNode = root;
    
        do
        {
            while (loopNode != 0) // 左子树(L)
            {
                if (loopNode->leftChild == 0)
                {
                    loopNode->leftTag = ThreadTag::PredecessorOrSuccessor;
                }
                else
                {
                    loopNode->leftTag = ThreadTag::LeftOrRightChild;
                }
    
                if (loopNode->rightChild == 0)
                {
                    loopNode->rightTag = ThreadTag::PredecessorOrSuccessor;
                }
                else
                {
                    loopNode->rightTag = ThreadTag::LeftOrRightChild;
                }
    
                nodeStack.push(loopNode);
                loopNode = loopNode->leftChild;
            }
    
            if (!nodeStack.empty())
            {
                loopNode = nodeStack.top();
                nodeStack.pop();
    
                // 左子树为空,则NULL或前驱
                if (loopNode->leftTag == ThreadTag::PredecessorOrSuccessor)
                {
                    loopNode->leftChild = predNode;
                }
    
                // 如果前驱存在,且右子树为空,则NULL或后继
                if (predNode != 0 && predNode->rightTag == ThreadTag::PredecessorOrSuccessor)
                {
                    predNode->rightChild = loopNode;
                }
    
                predNode = loopNode;
                loopNode = loopNode->rightChild; // 右子树(R)
            }
        } while (loopNode != 0 || !nodeStack.empty());
    }
    

4 线索二叉树的遍历 (Traversal)

由于我们多了线索,所以遍历可以更轻松了,只需要根据线索逐个进行即可。

以下以中序遍历为例。

4.1 获取首尾结点 (First and Last Node)

// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree
// 中序遍历第一个结点
template<typename T>
ThreadNode<T>* ThreadTreeInorderFirstNode(ThreadNode<T>* root)
{
    if (root == 0)
    {
        return 0;
    }

    ThreadNode<T>* first = root;
    while (first->leftTag == ThreadTag::LeftOrRightChild)
    {
        first = first->leftChild;
    }
    return first;
}
// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree
// 中序遍历最后一个结点
template<typename T>
ThreadNode<T>* ThreadTreeInorderLastNode(ThreadNode<T>* root)
{
    if (root == 0)
    {
        return 0;
    }

    ThreadNode<T>* last = root;
    while (last->rightTag == ThreadTag::LeftOrRightChild)
    {
        last = last->rightChild;
    }
    return last;
}

4.2 获取后继前驱结点 (Successor and Predecessor Node)

// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree
// 中序遍历后继结点
template<typename T>
ThreadNode<T>* ThreadTreeInorderSuccessor(ThreadNode<T>* node)
{
    if (node == 0)
    {
        return 0;
    }

    if (node->rightTag == ThreadTag::LeftOrRightChild) // 如果有右子树
    {
        return ThreadTreeInorderFirstNode(node->rightChild); // 返回右子树中序第一个结点
    }
    else // 如果没有右子树,找线索
    {
        return node->rightChild; // 后继
    }
}
// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree
// 中序遍历前驱结点
template<typename T>
ThreadNode<T>* ThreadTreeInorderPredecessor(ThreadNode<T>* node)
{
    if (node == 0)
    {
        return 0;
    }

    if (node->leftTag == ThreadTag::LeftOrRightChild) // 如果有左子树
    {
        // 返回左子树中序最后一个结点(最后一个没有右子树的结点)
        return ThreadTreeInorderLastNode(node->leftChild);
    }
    else // 如果没有左子树,找线索
    {
        return node->leftChild; // 前驱
    }
}

4.3 中序遍历 (Inorder Traversal)

// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree

// 中序遍历
template<typename T>
void ThreadTreeInorderTraversal(ThreadNode<T>* root, void(*pVisit)(ThreadNode<T>&))
{
    for (ThreadNode<T>* node = ThreadTreeInorderFirstNode(root);
         node != 0; 
         node = ThreadTreeInorderSuccessor(node))
    {
        (*pVisit)(*node);
    }
}

// 中序反向遍历
template<typename T>
void ThreadTreeInorderTraversalReverse(ThreadNode<T>* root, void(*pVisit)(ThreadNode<T>&))
{
    for (ThreadNode<T>* node = ThreadTreeInorderLastNode(root);
         node != 0;
         node = ThreadTreeInorderPredecessor(node))
    {
        (*pVisit)(*node);
    }
}

5 主函数与测试 (Main Method and Testing)

测试的线索二叉树为:

A
B
C
NULL
D
E
NULL

5.1 主函数 (Main Method)

// Author: https://blog.youkuaiyun.com/DarkRabbit
// Threaded Binary Tree

#include "threaded_binary_tree.h"
#include <iostream>
using namespace std;
using namespace BinaryTrees;

typedef ThreadNode<int>* ThreadedBinaryTree;

// 打印访问结点
void PrintVisitedElement(ThreadNode<int>& node)
{
    cout << (char)(node.element);
}

int main()
{
    ThreadedBinaryTree tree = new ThreadNode<int>('A');
    tree->leftChild = new ThreadNode<int>('B');
    tree->rightChild = new ThreadNode<int>('C');
    tree->leftChild->rightChild = new ThreadNode<int>('D');
    tree->rightChild->leftChild = new ThreadNode<int>('E');

    InitializeInorderThread(tree); // 非递归

    //ThreadNode<int>* pred = 0;
    //InitializeInorderThread(tree, pred); // 递归

    ThreadTreeInorderTraversal(tree, PrintVisitedElement);
    cout << endl;
    ThreadTreeInorderTraversalReverse(tree, PrintVisitedElement);
    cout << endl;

    delete tree->rightChild->leftChild;
    delete tree->leftChild->rightChild;
    delete tree->rightChild;
    delete tree->leftChild;
    delete tree;

    //system("pause"); VC++
    return 0;
}

5.2 打印结果 (Print Output)

BDAEC
CEADB

请按任意键继续. . .

线索二叉树(Threaded Binary Tree) A threaded binary tree is a binary tree variant that allows fast traversal: given a pointer to a node in a threaded tree, it is possible to cheaply find its in-order successor (and/or predecessor). 阅读详情

相关推荐

叉线索树(Threaded Binary Tree)的实现与应用

通过以上的代码实现,我们成功地创建了一个叉线索树并进行了线索化。叉线索树在中序遍历时具有更高的效率,因为我们可以利用前驱和后继指针直接访问下一个节点,而无需通过递归或栈操作。此外,为了实现线索化,我们还需要添加指向前驱节点和后继节点的指针。接下来,我们可以实现叉线索树的线索化函数。线索化函数将遍历二叉树,并将节点的前驱和后继指针连接到正确的节点上。这里我们以中序遍历为例。为了验证线索化的正确性,我们可以实现一个中序遍历函数,并在其中打印每个节点的数据。函数,我们可以按中序遍历的顺序打印叉线索树的节点数据。

HackSquad的博客 137

C语言——线索二叉树(前序、中序、后序-附代码)

线索二叉树(Threaded Binary Tree)是一种特殊的二叉树,通过将空指针改为线索(即前驱或后继指针)的方式,将二叉树中的空闲指针利用起来,从而实现对二叉树的高效遍历和查找。线索化是将二叉树以某种遍历方式进行扫描,并为每个节点添加线索的过程。常规二叉树的遍历需要使用递归或堆栈等数据结构,效率较低。而线索二叉树通过将原本为空的指针改为前驱或后继线索,实现了对二叉树的高效遍历和查找。

Pan_peter的博客 2919

HarmonyOS开发第一步:Dev Eco Studio4.0保姆级安装配置指南(含Node.js环境)

本文提供HarmonyOS开发环境搭建的保姆级教程,重点详解Dev Eco Studio 4.0的安装与配置,并攻克Node.js环境与Ohpm包管理器的关键设置难点。通过清晰的步骤指引,帮助开发者从零开始,高效完成开发环境部署,顺利迈出鸿蒙应用开发的第一步。

lake5的博客 570

数据结构与算法精解:线索二叉树

摘要:本文介绍了线索二叉树的基本概念与C语言实现。线索二叉树通过在空指针处添加线索来优化遍历操作,包含前驱/后继节点查找功能。文章详细阐述了结点结构设计(包含数据域、左右子树指针和线索标识),以及初始化、插入、遍历(前序/中序/后序)等核心操作的接口定义与实现方法。代码示例展示了如何利用栈结构构建二叉树,并通过线索化处理提升遍历效率。该实现包含完整的线索化处理流程和三种遍历方式的适配实现。

WildPointer的博客 985

CH32V IAP跳转避坑指南:为什么你的APP跳不过去?从mstatus寄存器配置到函数属性详解

本文深入解析CH32V系列MCU的IAP跳转机制,从mstatus寄存器配置到函数属性优化,详细讲解如何避免APP跳转失败。文章涵盖地址准备、模式切换、跳转执行等关键步骤,并提供调试技巧与实战案例,帮助开发者快速解决CH32V IAP跳转中的常见问题。

weixin_30955617的博客 140

[MTK][Android P]如何去掉差分包中的preloader分区

最近碰到一个问题,在进行差分升级的时候,会因为某些原因导致preloader hash值不匹配,升级失败,所以需要在差分升级的时候不升级preloader。 解决的方法,就是在制作AB分区的差分升级包的时候,把目标zip解压出来,把ab_partitions.txt中的分区名去掉,同时把preloader.img去掉 修改如下: Project/build/tools/releasetool...

thonmin的专栏 1434

数据结构-10:线索二叉树

线索二叉树是在普通二叉树的基础上,为每个节点增加额外的指针,以便在遍历过程中快速找到节点的前驱和后继。通过这种方式,线索二叉树能够在不使用栈或递归的情况下,实现高效的中序遍历。定义与目的:线索二叉树通过利用空闲指针实现高效的中序遍历,减少遍历时的时间和空间开销。节点结构:在线索二叉树中,节点除了存储数据和左右子指针外,还包含标志位指示指针是否为线索。构建方法:通过中序遍历的过程中建立前驱和后继的线索关系。遍历方法:利用线索指针实现无需栈或递归的中序遍历,提升遍历效率。优缺点优点。

m0_69378371的博客 1407

图形引擎实战:镭射效果制作分享

该方案的优势1.遵循物理的2.可以使用少量的参数去调控镭射的效果。计算相对简单,缺点仍是颜色不能够自定义,还有一种常见的方案是采样一张镭射贴图来模拟,好处是颜色可以自定义同时性能上还很高效没有复杂的公式计算。我查阅了网上普遍的方案,常见的做法是制作一个Ramp图生成工具,然后将生成好的ramp图赋给材质。这两个方案的好处是美术同学可以手动的去控制镭射的颜色。最后就是Shader中对Ramp图的采样的部分,Ramp图的UV坐标是使用fresnel作为Ramp的U轴坐标,0.5作为V轴坐标。

qq_41166022的博客 1359

Java描述数据结构之线索二叉树(Threaded Binary Tree)

      虽然把树转换为二叉树可减少空间的浪费,但是如果我们仔细观察使用链表建立的n节点二叉树,会发现用来指向左右节点的指针只有n-1个链接,另外的n+1个指针都是空链接。线索二叉树就是把这些空的链接加以利用,再指到树的其他节点,而这些链接就称为”线索“(thread),而这棵树就称为线索二叉树(Threaded Binary Tree)。将二叉树转换为线索二叉树的步骤如下:①先将二叉树通过中序...

样young的博客 508

LabVIEW+数据库应用系列保姆级教程,第二篇增删查改

2021-7-2 先挖好坑

wwplh5520370的博客 7364

IBM X3650 M4做raid阵列

步骤1.开机出现此界面,同时按ctrl键和h键,进入IBM X3650 M4配置raid界面。 【注】不知道是不是因为我的服务器长期闲置,按键ctrl键和h键居然无法进入raid配置界面。这时候,我们可以进bios同样可以进入raid配置界面。如果你按ctrl键和h键就可以直接进入raid配置界面,那么请忽略此段,直接看步骤2 开机,按键F1,选中system setting ,接着选中Adapters and UEFI Drivers ...

ani5565的博客 2万+

03. 线索二叉树(Threaded Binary Tree)

线索二叉树(Threaded Binary Tree) 为了方便自己进行修改,这里放上我的为知笔记的外链: http://7c0bab95.wiz03.com/share/s/1Y2WKl218k5e2gpBCl2BeEsq3et2Wf1BF4_F2Z_yn516cZv_

Al_assad的博客 612

TC3XX - MCAL知识点(十一):WDG EB-tresos配置说明与代码浅析

在AUTOSAR中,看门狗栈实现了三种监控机制:实时监控:用于周期软件的定时监控期限监督:针对非周期软件逻辑监督:用于监督执行顺序的正确性看门狗(WDG)驱动实现AUTOSAR(4.2.2)中规定的看门狗SWS,提供初始化、改变操作模式和设置触发条件(超时)等服务,供看门狗硬件(WDT)用户使用。WDG驱动的用户包括:模式管理模块(用于初始化),WdgM通过Wdglf设置触发条件和驱动运行模式设置。WdgM实施上述监督机制。AUTOSAR扩展触发概念,以支持窗口看门狗模式。

梦想技术家 3603

(数据结构基础)Among the following threaded binary trees (the threads are represented by dotted curves),……

当年学这些的时候真的是苦于没有人讲,现在复习考研,我会见到这种题就写下来,学弟学妹们欢迎点个关注,最近也在创业想实习的可以找我联系;没看懂的话是我表述有问题,欢迎指出和私戳。 Among the following threaded binary trees (the threads are represented by dotted curves), which one is the postorder threaded tree? 答案 B(见下图) 分析 线索二叉树(threaded )的目的和使用方

best_LY的博客 4471

NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案

本文主要介绍了NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

线索二叉树 Threaded Binary Tree (不用递归,不用栈,遍历二叉树)

线索二叉树 Threaded Binary Tree 不用递归,不用栈,遍历二叉树 Using Morris Traversal, we can traverse the tree without using stack and recursion. The idea of Morris Traversal is based on Threaded Binary Tree. In

jiyanfeng1的专栏 776

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Threaded Binary Tree

#include &lt;stdio.h&gt; enum pointer_tag { LINK, THREAD }; struct node { char* data; struct node* lchild; struct node* rchild; enum pointer_tag ltag, rtag; }; void visit(char...

yangjingxu的专栏 123

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

二叉树数据结构:从基础概念到工程实践

二叉树作为基础数据结构,通过节点间的父子关系实现层次化数据组织。其核心原理在于每个节点最多拥有两个子节点,这种结构特性使得二叉树在查找、排序等操作中展现出对数级时间复杂度优势。在技术价值层面,二叉树衍生出了二叉搜索树、平衡二叉树等多种高效变体,广泛应用于数据库索引、文件系统等场景。特别是结合递归与迭代遍历算法,二叉树能够高效处理层次化数据查询。现代工程实践中,二叉树优化技术如内存布局调整和并行处理进一步提升了性能表现,而AVL树、红黑树等平衡结构则解决了数据倾斜问题。从算法题到实际系统设计,掌握二叉树及其变

weixin_30654583的博客 1363

二叉树核心原理与应用实践全解析

二叉树作为基础数据结构,通过左右子节点的有序排列实现高效数据组织。其核心原理在于递归结构与数学特性,如高度为h的二叉树最多包含2^(h+1)-1个节点。这种结构特性使其在算法优化中展现出独特价值,例如二叉搜索树可实现O(log n)时间复杂度查找,堆结构支持高效排序。工程实践中,二叉树衍生出AVL树、红黑树等变种,广泛应用于数据库索引、内存管理等场景。在机器学习领域,决策树和XGBoost等算法进一步拓展了二叉树的应用边界。通过优化节点布局和采用内存池技术,二叉树性能可提升40%以上,是计算机科学中平衡理论

aodanchui1057的博客 465

二叉树基础概念、遍历与应用全解析

二叉树作为基础数据结构,每个节点最多包含两个子节点,具有明确的左右子树区分。其核心原理在于通过递归定义实现高效查找与操作,时间复杂度可达O(log n)。在技术价值上,二叉树为数据库索引、文件系统等场景提供底层支持,衍生出的二叉搜索树、AVL树等变体更是算法优化的经典案例。实际开发中,二叉树遍历分为深度优先(前序、中序、后序)和广度优先两种策略,应用于表达式求值、路由算法等场景。通过Python/Java等代码示例,可直观理解节点操作与平衡维护,其中前序遍历与层次遍历是解决LeetCode高频题目的关键技巧

xpp02的专栏 384

Leetcode Recover Binary Search Tree

Leetcode Recover Binary Search Tree,本题的关键是“如何使用O(1)的空间遍历树”和“找出两个被swap的节点”。如何使用O(1)的空间遍历树这里主要需要使用一个数据节构Threaded binary tree,借助于Threaded binary tree可以很快的实现遍历。此外,使用in-order遍历搜索二叉树,正好是以升序遍历整个数据。找出两个被swap的节

Ttssxuan 654

二叉树中序遍历:原理、实现与应用场景

二叉树中序遍历(In-order Traversal)是数据结构中的基础算法,遵循'左子树→根节点→右子树'的访问顺序,特别适合需要有序输出的场景。其核心原理是利用递归或栈实现深度优先搜索,时间复杂度为O(n)。在工程实践中,中序遍历常用于二叉搜索树验证、文件系统索引等场景,能有效处理有序数据。递归实现简洁但可能栈溢出,迭代版本通过显式栈避免这一问题,而Morris遍历则以O(1)空间复杂度优化内存使用。掌握中序遍历不仅有助于算法面试,也是开发高效树形结构处理工具的关键技术。

weixin_33831673的博客 399

嵌入式数据结构实战:栈队列二叉树的资源受限实现

在嵌入式系统中,栈、队列、二叉树并非抽象算法概念,而是直面内存限制、中断响应与实时性约束的核心工程组件。其设计本质是物理内存布局问题——栈涉及SP寄存器操作与栈帧对齐,队列需应对DMA高频率写入与无锁同步,二叉树则必须放弃动态指针、转向线索化数组索引以压缩RAM占用。这些结构共同支撑协议解析、实时调度与本地检索等关键场景,技术价值体现在确定性执行、零动态分配与字节级资源可控。本文聚焦STM32、ESP32、GD32等主流MCU平台,详解三类结构在中断上下文、FreeRTOS任务及裸机环境下的硬核落地方法。

weixin_30521161的博客 352

二叉树翻转:递归与迭代实现及应用场景

二叉树是计算机科学中重要的数据结构,广泛应用于算法设计与系统开发。翻转二叉树通过交换每个节点的左右子树,实现树结构的镜像变换,这一操作深刻体现了分治思想与树遍历原理。从技术实现看,递归解法利用DFS后序遍历天然契合问题特性,而迭代解法则通过BFS队列或DFS栈避免递归深度限制。在图像处理镜像算法、决策树可视化等场景中,翻转操作能有效支持对称性需求。作为LeetCode高频面试题,该问题既考察基础数据结构理解,又检验递归/迭代的工程实现能力,是连接算法理论与开发实践的优秀案例。

weixin_30635053的博客 377

数据结构与算法---线索化二叉树(Threaded BinaryTree)

先看一个问题 将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上. 如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办? 解决方案-线索二叉树 ...

weixin_30781107的博客 263
上一篇: 编程基础 - 二叉树 (Binary Tree)
下一篇: 编程基础 - 二叉排序树 (Binary Search Tree)
沙沙的兔子
博客等级 码龄17年 359粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值