二叉树学习笔记

news2024/11/24 19:54:09

 1、链表实现二叉树

// 树节点类
class Bitreenode {
    char data;
    Bitreenode* ls, * rs, * fa;  // ls为左儿子节点,rs为右儿子节点,fa为父节点
public:
    Bitreenode() {
        data = '0';
        ls = rs = fa = nullptr;
    }
    void set_ls(Bitreenode *p) {
        ls = p;
    }
    void set_rs(Bitreenode* p) {
        rs = p;
    }
    void set_data(char d) {
        data = d;
    }
    void set_fa(Bitreenode* p) {
        fa = p;
    }
    char get_data() {
        return data;
    }
    Bitreenode* get_ls() {
        return ls;
    }
    Bitreenode*  get_rs() {
        return rs;
    }
    Bitreenode* get_fa() {
        return fa;
    }
};

string s;  
int pos;
char son[100];
char fa[100];

class Bitree {
    Bitreenode* root;
    int num;
    int cnt;
    int h;
public:

    // 建树前初始化工作
    void Creat() {
        pos = 0;
        num = 0;
        cnt = 0;
        h = 0;
        root = creat_tree(nullptr, 0);
    }
    
    // 建树方法采用“先序遍历+空树用0表示”的方法
    Bitreenode* creat_tree(Bitreenode * fa, int height) {
        Bitreenode* cn;
        if (pos >= s.size()) {
            return nullptr;
        }
        char ch = s[pos];
        if (ch == '0') {
            pos++;
            cn = nullptr;
        }
        else {
            height++;
            h = max(h, height);
            cn = new Bitreenode;
            cn->set_data(ch);
            cn->set_fa(fa);
            num++;
            pos++;
            cn->set_ls(creat_tree(cn, height));
            cn->set_rs(creat_tree(cn, height));
        }
        return cn;
    }

    // 前序遍历
    void preOrder(Bitreenode *p) {
        if (p != nullptr) {
            cout << p->get_data();
            preOrder(p->get_ls());
            preOrder(p->get_rs());
        }
    }

    // 中序遍历
    void inOrder(Bitreenode* p) {
        if (p != nullptr) {
            inOrder(p->get_ls());
            cout << p->get_data();
            inOrder(p->get_rs());
        }
    }

    // 后序遍历
    void posOrder(Bitreenode* p) {
        if (p != nullptr) {
            posOrder(p->get_ls());
            posOrder(p->get_rs());
            cout << p->get_data();
        }
    }

    // 计算叶节点数
    int get_sonnode(Bitreenode *p) {
        if (p != nullptr) {
            if (p->get_ls() == nullptr && p->get_rs() == nullptr) {
                son[cnt] = p->get_data();
                fa[cnt] = p->get_fa()->get_data();
                cnt++;
            }
            else {
                get_sonnode(p->get_ls());
                get_sonnode(p->get_rs());
            }
        }
        return cnt;
    }

    // 层序遍历
    void levelOrder(Bitreenode* p) {
        queue<Bitreenode*> q;
        if (p == nullptr) {
            return;
        }
        q.push(p);
        while (q.empty() != 1) {
            p = q.front();
            q.pop();
            cout << p->get_data();
            if (p->get_ls() != nullptr) {
                q.push(p->get_ls());
            }
            if (p->get_rs() != nullptr) {
                q.push(p->get_rs());
            }
            
        }
    }
    
    // 返回根节点
    Bitreenode* get_root() {
        return root;
    }

    // 返回树的深度
    int get_h() {
        return h;
    }
};

2、数组实现二叉树

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include<queue>
using namespace std;

struct Bitree {
	int data;
	int ls;
	int rs;
};

void preOrder(Bitree * p, int n, int pos) {
	if(p[pos].data != 0) {
		cout << p[pos].data << " ";
		if(p[pos].ls != -1)preOrder(p, n, p[pos].ls);
		if(p[pos].rs != -1)preOrder(p, n, p[pos].rs);
	}
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		Bitree* p = new Bitree[n + 1];
		for (int i = 1; i <= n; i++) {
			cin >> p[i].data;
			if (2 * i <= n) {
				p[i].ls = 2 * i;
			}
			else p[i].ls = -1;

			if (2 * i + 1 <= n) {
				p[i].rs = 2 * i + 1;
			}
			else p[i].rs = -1;
		}
		preOrder(p, n, 1);
		cout << endl;
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ONNX推理流程

文章目录 python版API推理流程 python版API推理流程 使用netron工具查看onnx网络结构 如下图&#xff0c;可以看出此次要使用的网络输入为&#xff1a; 输入名称&#xff1a;input输入形状&#xff1a;[1, 3, 256, 256]输入数据类型&#xff1a;float32 网络的输出为&#xff1…

如何利用IP地址定位保护网络安全?

通过IP地址定位可以在一定程度上增强网络安全&#xff0c;但它并不是唯一的安全措施。以下是如何利用IP地址定位来保护网络安全的一些方法&#xff1a; 异常检测和入侵检测&#xff1a;监控网络上的IP地址流量&#xff0c;定位异常活动&#xff0c;如大规模的连接尝试、不寻常的…

习题1. 31

话不多说 先上代码 (defn product [ term a nxt b](defn iter [a result](if (> a b)1 (* (term a) (iter (nxt a) result))))(iter a 1)) 跟习题1.30比较起来&#xff0c;就是两个地方不同 乘法不能乘0 必须是1。难度来讲&#xff0c;跟1.30难度是一样的。增加了迭代过…

Qt之submodule编译

工作中会遇到这样一种情况&#xff1a;qt应用程序在运行时提示找不到某个qt的动态库。我遇到的是缺少libQt5Websocket.so&#xff0c;因为应用程序是在x86平台银河麒麟v10上开发&#xff0c;能够正常编译运行&#xff0c;然后移植到rk3588&#xff08;aarch64架构&#xff09;上…

阿里云/腾讯云/华为云国际版实名账号:亚太已发展超2500个本地生态伙伴 超50%收入由伙伴创造

华为全联接大会2022在泰国开幕&#xff0c;以“创新无限&#xff0c;一切皆服务”为主题的华为云峰会成功举办&#xff0c;华为云亚太地区部总裁曾兴云、华为云首席产品官方国伟以及多位客户伙伴发表主旨演讲。会上&#xff0c;华为云发布《云原生2.0架构白皮书》并联合CNCF&am…

OpenResty安装

OpenResty 是一个基于 Nginx 的 Web 平台&#xff0c;它将 Nginx 和 Lua 脚本语言结合起来&#xff0c;提供了更强大的 Web 应用开发和部署能力。OpenResty 仓库是 OpenResty 项目的官方仓库&#xff0c;包含了 OpenResty 的源代码、文档、示例等资源。 OpenResty 仓库地址是&…

【C++】位图及其应用

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

【算法-动态规划】钢条切割问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

python一行命令搭建web服务,实现内网共享文件

python一行命令搭建web服务&#xff0c;实现内网共享文件 有时候我们在本地电脑访问自己的虚拟机的时候&#xff0c;可能因为某些原因无法直接CV文件到虚拟机。但此时我们又想上传文件到虚拟机&#xff0c;如果虚拟机和本地电脑可以互通。那么我们可以直接通过python来启动一个…

安全巡检管理系统—隐患排查治理

安全管理越来越重要&#xff0c;每个生产企业都需要一个安全隐患排查治理小程序&#xff01;利用凡尔码平台搭建安全巡检管理系统主要有以下四个功能 1、制定巡检计划&#xff1a;安全巡检管理系统可以帮助用户制定巡检计划&#xff0c;用户可以根据需要创建不同的计划&#xf…

浅谈MDK, IAR,CLANG和GCC的局部变量字节对齐处理差异(2023-10-13)

视频&#xff1a; https://www.bilibili.com/video/BV1CB4y1Z7kA 浅谈MDK, IAR, CLANG和GCC的局部变量字节对齐处理差异 问题由来&#xff1a; 早期这个帖子里面的局部变量对齐仅测试了MDK AC5&#xff0c;但项目中使用AC6发现了新问题&#xff0c;看来AAPCS规约研究的还是不…

Discuz大气游戏风格模板/仿lol英雄联盟游戏DZ游戏模板GBK

Discuz大气游戏风格模板&#xff0c;lol英雄联盟游戏模板&#xff0c;DZ游戏娱乐模板GBK。模板名称&#xff1a;lol英雄联盟游戏&#xff08;m0398_lol&#xff09; 下载地址&#xff1a;https://bbs.csdn.net/topics/617408069

多维高斯分布(多元正态分布)的概率密度函数和最大似然估计

多元高斯分布的概率密度函数 f μ , Σ ( x ) 1 ( 2 π ) D / 2 1 ∣ Σ ∣ 1 / 2 e x p { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } f_{\mu, \Sigma}(x)\frac{1}{(2 \pi)^{D/2}} \frac{1}{|\Sigma|^{1/2}} exp\{-\frac{1}{2}(x-\mu)^T \Sigma ^{-1}(x-\mu)\} fμ,Σ​(x)…

车载电子电器架构 —— 车载芯片技术简介

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

芯片制造:一颗芯片到底是如何诞生的(下)

目录 背景 芯片制造&#xff1a;晶圆厂的王国 上游&#xff1a;晶圆材料准备 中游&#xff1a;晶圆加工过程 下游&#xff1a;封装与测试 产业链分工视角&#xff1a;设计、制造、封装、测试的分工合作 小结 背景 上一讲&#xff0c;我带你从市场需求分析开始&#xff0…

嵌入式开发学习之STM32F407串口(USART)收发数据(三)

嵌入式开发学习之STM32F407串口&#xff08;USART&#xff09;收发数据&#xff08;三&#xff09; 开发涉及工具一、选定所使用的串口二、配置串口1.配置串口的I/O2.配置串口参数属性3.配置串口中断4.串口中断在哪里处理5.串口如何发送字符串 三、封装串口配置库文件1.创建头文…

洛谷【入门6】函数与结构体-P5735 【深基7.例1】距离函数

## 题目描述 给出平面坐标上不在一条直线上三个点坐标 (x1​,y1​),(x2​,y2​),(x3​,y3​)&#xff0c;坐标值是实数&#xff0c;且绝对值不超过 100.00&#xff0c;求围成的三角形周长。保留两位小数。 对于平面上的两个点 (x1​,y1​),(x2​,y2​)&#xff0c;则这两个点…

【C++】哈希对unordered_map和unodered_set的封装

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

第9期ThreadX视频教程:自制个微秒分辨率任务调度实现方案(2023-10-11)

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2023视频教程汇总&#xff0c;DSP第12期&#xff0c;ThreadX第9期&#xff0c;BSP驱动第26期&#xff0c;USB实战第5期&#xff0c;GUI实战第3期&#xff08;2023-10-11&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

“之江创客”聚焦农村电商创新发展 扎实助推共同富裕

10月10日下午&#xff0c;由商务部中国国际电子商务中心指导&#xff0c;浙江省商务厅等十个部门主办&#xff0c;浙江省电子商务促进中心联合丽水市商务局承办的“之江创客”2023全球电子商务创业创新大赛农村电商赛区决赛暨颁奖典礼在丽水圆满落幕。浙江省商务厅党组成员、副…