二叉树C++ Version

C与C++各版本标准 C89,99,11标准 C++98,03,11,14标准 C89与C99标准比较 均有对应PDF格式文档,另附C89中文版PDF 免积分! 立即下载
#include <iostream.h>
#include <cstring>

typedef int KeyType;
#define NUM 11
class BinStree;
class BinSTreeNode
{
public:
    KeyType key;
    BinSTreeNode *lchild;
    BinSTreeNode *rchild;
    BinSTreeNode()
    {
        lchild = NULL;
        rchild = NULL;
    }
};

class BinSTree
{
public:
    BinSTreeNode *root;
    BinSTree()
    {
        root = NULL;
    }
    ~BinSTree()
    {
        //delete root;
    }
    BinSTreeNode *BSTreeSearch( BinSTreeNode *bt, KeyType k, BinSTreeNode *&p );
    void BSTreeInsert( BinSTreeNode *&bt, KeyType k );
    int BSTreeDelete( BinSTreeNode *&bt, KeyType k );
    void BSTreePreOrder(BinSTreeNode *bt);
    bool IsEmpty()
    {
        return root == NULL;
    }
};

/**
  *  二叉树排序查找算法
  *  在根指针为bt的二叉排序树中查找元素k的节点,若查找成功,则返回指向该节点的指针
  *  参数p指向查找到的结点,否则返回空指针,参数p指向k应插入的父结点
  */
BinSTreeNode* BinSTree::BSTreeSearch( BinSTreeNode *bt, KeyType k, BinSTreeNode *&p )
{
    BinSTreeNode *q = NULL;
    q = bt;
    while(q)
    {
        p = q;
        if( q->key == k )
        {
            return(p);
        }
        if( q->key > k )
            q = q->lchild;
        else
            q = q->rchild;
    }
    return NULL;
}

/**
  *  二叉排序树的插入节点算法
  *  bt指向二叉排序树的根结点,插入元素k的结点
  */
void BinSTree::BSTreeInsert( BinSTreeNode *&bt, KeyType k )
{
    BinSTreeNode *p = NULL, *q;
    q = bt;
    if( BSTreeSearch( q, k, p ) == NULL )
    {
        BinSTreeNode *r = new BinSTreeNode;
        r->key = k;
        r->lchild = r->rchild = NULL;
        if( q == NULL )//这里的q代表的bt,不是search函数里面的q
        {
            bt = r;         //被插入节点做为树的根节点
        }
        if( p && k < p->key )
            p->lchild = r;
        else if( p )
            p->rchild = r;
    }
}
/**
 * 中序遍历 
 */ 
void BinSTree::BSTreePreOrder(BinSTreeNode *bt)
{
    if(bt != NULL)
    {
        cout << bt->key << " ";
        BSTreePreOrder(bt->lchild);
        BSTreePreOrder(bt->rchild);
    }
}
/**
  * 二叉排序树的删除结点算法
  * 在二叉排序树中删除元素为k的结点,*bt指向二叉排序树的根节点
  * 删除成功返回1,不成功返回0.
  */
int BinSTree::BSTreeDelete( BinSTreeNode *&bt, KeyType k )
{
    BinSTreeNode *f, *p, *q, *s;
    p = bt;
    f = NULL;
    //查找关键字为k的结点,同时将此结点的双亲找出来
    while( p && p->key != k )
    {
        f = p;
        if( p->key > k )
            p = p->lchild;
        else
            p = p->rchild;
    }
    if( p == NULL )   //找不到待删除的结点时返回
        return 0;
    if( p->lchild == NULL )  //待删除结点的左子树为空
    {
        if( f == NULL )  //待删除结点为根节点
            bt = p->rchild;
        else if( f->lchild == p )  //待删结点是其双亲结点的左节点
            f->lchild = p->rchild;
        else
            f->rchild = p->rchild;  //待删结点是其双亲结点的右节点
        delete p;
    }
    else                    //待删除结点有左子树
    {
        q = p;
        s = p->lchild;
        while( s->rchild )  //在待删除结点的左子树中查找最右下结点
        {
            q = s;
            s = s->rchild;
        }
        if( q == p )
            q->lchild = s->lchild;
        else
            q->rchild = s->lchild;

        p->key = s->key;
        delete s;
    }
    return 1;
}
int main( void )
{
    int a[NUM] = { 34, 18, 76, 13, 52, 82, 16, 67, 58, 73, 72 };
    int i;
    BinSTree bst;
    BinSTreeNode *pBt = NULL, *p = NULL, *pT = NULL;

    for( i = 0; i < NUM; i++ )
    {
        bst.BSTreeInsert( pBt, a[i] ); //创建二叉排序树
    }
    pT = bst.BSTreeSearch( pBt, 52, p ); //搜索排序二叉树
    bst.BSTreePreOrder(pBt);
    cout << endl;
    bst.BSTreeDelete( pBt, 13 );   //删除无左孩子的情况
    bst.BSTreePreOrder(pBt);
    cout << endl;
    bst.BSTreeDelete( pBt, 76 );   //删除有左孩子的情况
    bst.BSTreePreOrder(pBt);
    cout << endl;
    return 0;
}



注意:? *& bt 和 *bt 和&bt的不同。

GPU大规模集群运维 CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的通用并行计算平台和程序模型,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员可以使用C语言来为CUDA架构编写程序,所编写出的程序可以在支持CUDA的处理器上以超高性能运行。CUDA官方文档CUDA的软件环境允许开发者使用C++等高级编程语言开发程序。 阅读详情

相关推荐

BK7238(XH-WB3S)固件烧录实战:从AT固件选择到稳定下载全解析

本文详细解析了BK7238(XH-WB3S)模组固件烧录的全过程,从AT固件版本选择到稳定下载的实战技巧。重点介绍了烧录前的准备工作、硬件连接的正确姿势、烧录软件的实战技巧以及疑难问题排查指南,帮助开发者高效完成BK7238模组的固件烧录。

weixin_29159441的博客 251

c++的二叉树

目录 二叉树的定义 二叉树的分类 1. 完全二叉树 2. 满二叉树 3. 斜树 4. 二叉搜索树 5. 平衡二叉树 二叉树的存储方式 1. 数组存储 2. 链表存储 二叉树的遍历方式 1. 前序遍历 2. 中序遍历 3. 后序遍历 4. 层序遍历 二叉树的代码实现 总结 技术参考 二叉树的定义 二叉树是每个节点最多只有两个子树的数结构,两个子树称为左子树和右子树。 二叉树的分类 1. 完全二叉树 假设其深度为 d(d>1)。除了第 d 层外....

客舟中 1万+

Windows 10/11 安装 HYSPLIT 气象模型全攻略(附必备工具包下载清单)

本文提供了一份详尽的Windows 10/11系统下HYSPLIT气象模型安装与配置全攻略。指南涵盖了从核心认知、必备工具包(Tcl/Tk、ImageMagick)下载,到分步安装、环境变量设置及首次运行验证的完整流程,旨在帮助研究者和学生高效部署这一用于大气轨迹模拟与污染物扩散分析的专业工具。

weixin_28335283的博客 609

数据结构之二叉树(c++)

本文章主要介绍二叉树的概念,二叉树的存储结构,二叉树的插入,删除,查找,遍历,等操作

qq_57541265的博客 1万+

爬虫实战:抖音视频搜索数据爬虫开发实战(附完整Python源码)

【代码】抖音视频搜索数据爬虫开发实战(附完整Python源码)

weixin_61226361的博客 3597

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

swindy博客 2407

二叉树详解(C++)

树状图是一种数据结构,它是由 n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树; 专业术语 中 文 描 述 根节点 一棵树的顶点 孩子节点 一个结点含有的子树的根结点称为该结点的子结点 叶子节点 .

qq_54169998的博客 1万+

基于PyTorch的BP神经网络PID控制器动态调参实战

本文详细介绍了基于PyTorch的BP神经网络PID控制器动态调参实战,结合BP神经网络的自适应能力和PID控制算法的经典优势,实现工业控制中的高效参数调整。通过PyTorch实现BP-PID融合架构,包括网络设计、损失函数优化及动态调参技巧,显著提升控制性能,适用于温度控制、电机控制等场景。

weixin_29094775的博客 522

C++实现树 - 02 二叉树

写在前面: 这一讲我们来看看二叉树的实现,还不清楚树的结构的小伙伴建议先看看上面一讲关于树的定义。 二叉树的定义 二叉树是每个结点最多有两个子树的树结构。也就是说二叉树不允许存在度大于2的树。它有五种最基本的形态:二叉树可以是空集。根可以有空的左自树或者右子树;或者左右子树都是空。其中只有左子树或者右子树的叫做斜树。 二叉树的主要性质 性质 结论 性质一 在二叉树的 i 层上至多有 2 ^ ( i - 1 ) 个结点( i >= 1 ) 性质二 深度为 k 的二叉树至多有 2.

Newin2020的博客 6751

【MATLAB代码】蚁群算法(Ant Colony Optimization, ACO)路径规划(避障)仿真程序,订阅专栏后可直接查看完整源代码

基于蚁群算法的路径规划系统。可自定义起点、终点和障碍物地图,系统通过蚁群算法自动计算最优路径,并输出路径坐标、障碍物地图和收敛曲线。完整MATLAB源代码直接运行。适用于复杂障碍环境下的路径优化问题。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 3091

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4193

C++树(四)二叉树

二叉搜索树( Binary Search Tree )它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;能够快速查找数据也是二叉搜索树被用于各类数据结构的原因,但这种快速是有限制的,即不会出现退化,假如二叉搜索树退化为链表,则无法做到快速查找数据的要求,所以又出现了平衡二叉树。遍历二叉树的方法可以沿用遍历树的方法——递归。

weixin_70468627的博客 2589

《用 R 探索医药数据科学》目录(持续更新,已超 250 万字)|订阅前说明

我们重磅推出《用 R 探索医药数据科学》专栏!本文作为专栏【订阅后首读】的核心内容,堪称开启学习之旅的 “入门钥匙”,也是整个专栏最关键的一篇指引文。文中不仅完整呈现了专栏 9 大核心篇章 + 问答板块的详细目录,更囊括了订阅后必知的核心要点 —— 从阅读设备、实操工具的使用建议,到学习路径、更新规则的清晰说明,再到问题反馈、感悟记录的实用方法,一站式帮你摸清专栏框架、找准学习方向。建议各位订阅者务必认真阅读、吃透内容,这能让你后续的学习更高效、少走弯!

MD Code 1万+

剑指 Offer(第2版)题解(C++ Version)

剑指 Offer(第2版)题解(C++ Version)

ProgramNovice的博客 1262

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ 11 手写二叉树中序遍历迭代器 [非递归]

本例实现迭代器模式,使用C++11手写二叉树的中序遍历迭代器。 程序结构如下, test/CMakeLists.txt cmake_minimum_required(VERSION 2.6) if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/software/vcpkg/ports/cppwor

zhuge19870104的博客 554

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AVLTree(C++ Version)

首先对右子树的根节点进行一次右旋转,使得右边高的左边高变为右边高的右边高。逻辑上是:右边高的左边高不会进行修正,但是右边高的右边高会啊使用左单旋。逻辑上是:左边高的右边高不会旋转,但是左边高的左边高会啊不就是右单旋。然后再对根结点进行左旋转。

2401_89521529的博客 701

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

E1. Rubik‘s Cube Coloring (easy version) 贪心,满二叉树(1300)

题意 : 给定一个层数为k的满二叉树,结点编号为标准的层序遍历的编号 魔方有六个面,如图,每个面一个颜色 树上的结点的颜色也是这六个颜色之一,但是两个相邻结点的颜色必须是 魔方中,颜色相邻的两种颜色 求这个满二叉树的合法染色方案 取模1e9 + 7 思路 : 假设固定根,每个结点必须和其父节点颜色满足要求 不管父节点颜色如何,这个结点都只有4种颜色可选 答案就是6∗4结点个数−16 * 4^{结点个数-1}6∗4结点个数−1 结点个数等于2k−12^k-12k−1 这里2k2^k2k不会爆ll,可..

m0_51448653的博客 624

题解 | #小A的线段(hard version)# #牛客小白月赛90# F题

前言:好不容易这次会这么多的题(偷溜出来打的,今天学校训练来着(线上讲题),对不住了朱哥T_T)可恶。内推码:EVVG01内推码:EVVG01内推码:EVVG01岗位类型:产品类,技术类,美术类,市场类。半点开发问题没问,研一时候发的论文被狠狠追问细节,可能太久不看回答疏漏了,结果他来了一句这论文你没参。兄弟们,我打算九月份找份实习,因为马上就没有在校生身份了,还要做本科毕设,现在只能先沉淀了。实施顾问要去哪个城市发展会更好一点背景:双非二本,江西人,在南昌用友做了一年不到的OA实施顾问,二月。

han_xue_feng的博客 687

《Cracking the Coding Interview 》之 二叉树的创建 与 遍历(非递归+递归version)

#include <iostream> #include <cstdio> #include <vector> #include <stack> #define ls(x) (((x + 1)<<1) - 1) #define rs(x) ((x + 1)<<1) using namespace std...

weixin_30498921的博客 103

Red_Black_Tree(C++ Version)

并且插入之前左右子树的黑色结点的个数为hb,插入旋转之后左右子树的黑色结点个数也是hb。当uncle为黑或者uncle不存在时,都需要进行旋转,旋转过后的树的根是黑色结点。所以路径上的黑色结点的个数是没有变化的并且根结点是黑色结点,所以就不需要继续向上。黑色结点的个数必须相同。进行检查,就可以直接推出循环。

2401_89521529的博客 734

1006. Tree Traversals - Hard Version (35)

n个结点 中序残缺列 先序残缺列 后序残缺列 求能不能唯一确定一棵二叉树,可以输出中序遍历、先序遍历、后序遍历、层次遍历;每个遍历后面没有多余的空格。 不能唯一确定输出“Impossible” 我一共尝试了5种方法, 一、一种方法是错误的(5个测试点错误); 二、另一种方法考虑没有周全(两个测试点错误); 三、一种方法直接递归(最后一个测试点运行超时) 四。一种方法把递归的拆成两部分,存入多维数组里面(最后一个测试点内存超限)【这个代码中有vector的[]传参】 五、把第三种和第二种部分相结合

⊙-→棒棒糖ing .____` 5469

Leetcode_binary-tree-level-order-traversal (updated c++ and python version)

地址:http://oj.leetcode.com/problems/binary-tree-level-order-traversal/ Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For

x 700

Leetcode_path-sum (updated c++ and python version)

地址:http://oj.leetcode.com/problems/path-sum/ Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. Fo

x 608

C/C++刷题环境搭建与STL实战:从零掌握算法底层实现

算法是计算机科学的核心基础,其本质是通过特定步骤高效解决计算问题。理解算法的时间与空间复杂度,关键在于掌握数据在内存中的组织与访问方式。C/C++语言因其贴近硬件、内存管理透明的特性,成为深入理解算法底层原理的理想工具。通过手动管理内存、操作指针,开发者能直观感知数据结构的扩容、拷贝开销,从而建立对算法性能的深刻认知。在工程实践中,标准模板库(STL)提供了vector、unordered_map等高效容器,配合sort、binary_search等泛型算法,能极大提升开发效率。本文以LeetCode算法训

weixin_30423977的博客 351

Leetcode_binary-tree-zigzag-level-order-traversal (updated c++ and python version)

地址:http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right

x 837

ACM经验总结(09/21 version02)

导航头文件常用函数位运算快速排序小贴士Cctype检测转换String基本操作初始化遍历元素编辑进阶操作Vector基本操作初始化遍历元素编辑Map基本操作初始化遍历元素编辑递归基础案例阶乘两两交换链表节点DFS栈基本操作链表快慢指针树建立二叉树遍历二叉树先序遍历中序遍历后序遍历队列BFSKMP匹配算法例题与答案 头文件 #include <iostream> #include &lt...

IcyLeaves的博客们 1041
上一篇: 二叉树的遍历:递归和非递归实现
下一篇: 算法题目一:全排列(C++实现)
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值