数据结构与算法_二叉树(BST树)_面试题总结

news/2024/5/1 19:05:05/文章来源:https://blog.csdn.net/weixin_43916755/article/details/128032060

这篇笔记记录二叉树相关的常考题。

1 BST树区间元素搜索问题

**解决方法:**利用BST树的中序遍历,中序遍历后输出的是从小到大的顺序。

	// 求满足区间的元素值 [i,j];void findValues(vector<T> &vec, int i, int j){// 封装一个递归接口 findValues(root_, vec, i, j);}void findValues(Node *node, vector<T> &vec,int i,int j){if (node != nullptr){if (node->data_ > i) // BAT中当前节点值大于左子树中任何一个值,所以,当前节点的值小于区间下界不用访问; {findValues(node->left_, vec, i, j);}// V if (node->data_ >= i && node->data_ <= j){vec.push_back(node->data_); // 存储满足区间元素的值}// 当前节点的右子树中。// BST树中当前节点的值小于右子树中的值;// 所以如果当前值区间上届j,所以当前节点小于j才访问,大于则不访问if (node->data_ < j){findValues(node->right_, vec, i, j);}}}

2 判断二叉树是否是一颗BST树

这道题根据BST树的定义:
BST树称为一颗搜索树或者二叉排序树,它或者是一颗空树;或者具有下列性质:
1 、若左子树不为空,则左子树上所有节点的值均小于它的根节点的值
2 、若右子树不为空,则右子树上所有节点的值均大于它的根节点的值
3 、左右子树也分别满足二叉搜索树性质
特点 :每一个节点都满足 左孩子的值(不为空) < 父节点的值 < 右孩子的值(不为空)
在这里插入图片描述

		bool isBSTree(){Node *pre = nullptr;return isBSTree(root_, pre);}/**	功能:判断二叉树是否为BST树*	思想:利用BST中序遍历后,按照升序的顺序。*	参数:*		 node: 当前处理的节点*		 &pre: 传递当前节点的引用*/bool isBSTree(Node *node, Node *&pre){if (node == nullptr){return true;}if (!isBSTree(node->left_, pre))  // 如果当前节点的左孩子节点与前序{return false;}if (pre != nullptr)		// 根节点的pre无法确认,所以判断根节点的pre是否为空{if (comp_(node->data_, pre->data_)){return false;}}pre = node;	 // 更新中序遍历的前驱节点return isBSTree(node->right_, pre);}

3 BST求子树问题

思想:先从大树中找到子树中的根节点,然后依次判断小树种根节点的左右子树。

bool isChildTree(BSTree<T, Comp> & child){// 在当前二叉树找child根节点 if (child.root_ == nullptr){return true;}Node *cur = root_;// 这个循环是为了在大树中找到与小树根节点相同的根节点while (cur != nullptr){if (cur->data_ == child.root_->data_){break;}else if (comp_(cur->data_,child.root_->data_)){cur = cur->right_;}else{cur = cur->left_;}}if (cur == nullptr){return false;}return isChildTree(cur, child.root_);}/**	功能:判断小树是否为大树的子树**	参数:*		 father: 大树中的节点	*		 child : 小树中的节点*/bool isChildTree(Node *father, Node *child){if (father == nullptr && child == nullptr)  // 如果孩子节点和父节点都是空{return true;}if (father == nullptr)	// 如果只有父节点是空,说明大树中不包含小树{return false;}if (child == nullptr){return true;}// 判断大树与小树的根节点是否相同if (father->data_ != child->data_){return false;}//return isChildTree(father->left_, child->left_) && isChildTree(father->right_, child->right_);if (isChildTree(father->left_, child->left_) && isChildTree(father->right_, child->right_)){return true;}else{return false;}}

4 BST的LCA(least Comment Ancestors,最近公共祖先问题) 问题:求寻找最近公共祖先节点

公共节点判断:如果当前节点介于val1和val2之间,就认为是LCA;
在这里插入图片描述

	/**	功能:最近公共祖先节点 **	参数:*		val1: 二叉树中的节点1*		val2: 二叉树中的节点2*/int getLCA(int val1, int val2){Node * node = getLCA(root_, val1, val2);if (node == nullptr){throw "no LCA";}else{return node->data_;}}	}}
Node * getLCA(Node *node,int  val1,int val2){if (node == nullptr){return nullptr;}// 如果当前节点 小于两个节点 if (comp_(node->data_, val1) && comp_(node->data_, val2)){return getLCA(node->right_, val1, val2);}else if (comp_(val1, node->data_) && comp_(val2, node->data_)){return getLCA(node->left_, val1, val2);}else{return node;}}

5 二叉树镜像对称问题

思想:node1的左孩子节点与node2的右孩子节点相同;node2的左孩子节点与node1的右孩子节点相同。
在这里插入图片描述

	bool mirror02(Node *node1, Node *node2){if (node1 == nullptr && node2 == nullptr){return true;}if (node1 == nullptr || node2 == nullptr) // 如果有一个不对称,则认为是非对称的。{return false;}if (node1->data_ != node2->data_){return false;}// 同时满足,一个node1的左孩子等于node2的右孩子,node2的右孩子等于node1的左孩子return mirror02(node1->left_, node2->right_) && mirror02(node1->right_, node2->left_);}

6 根据前序和中序重构二叉树

在这里插入图片描述

   /*	功能:根据前序中序序列,构建二叉树**   参数:*		 pre: 前序遍历序列*	     i  : 前序序列中的开始索引 , i+1 --- i + (k-m) 左子树中的节点*		 j  : 前序序列中的末尾索引	  i + (k-m)+1 --- j 右子树的节点*		 in :中序遍历序列	, k表示中序序列中根节点的索引下标。*		 m  : 中序序列中的开始索引   m --- k-1:中序左子树中节点*		 n  : 中序序列中的末尾索引   k+1 --- n : 中序右子树中节点*/Node * _rebuild(int pre[], int i, int j,int in[], int m, int n){if (i > j || m > n){return nullptr;}// 递归时候只需考虑当前节点以及当前节点的左右孩子节点。Node *node = new Node(pre[i]);  // 先根据pre序列中的第一个i节点,创建新树的根节点。for (int k = m; k <= n; ++k)	// 在中序中找根节点的左右孩子{if (pre[i] == in[k])		// 在中序中找子树根节点的下标k;{							node->left_ = _rebuild(pre, i + 1, i + (k - m),in, m, k - 1);node->right_ = _rebuild(pre, i + (k - m) + 1, j, in, k + 1, n);return node;}}return node;}

7 判断一颗二叉树是否为平衡二叉树

平衡: 任意节点的左右子树高度差,不能查过1 (0 1 -1 )
什么时候检测呢?递归回溯的时候;

	/*	功能:判断一颗二叉树是否平衡二叉树**	参数:*		node: 节点*	     l  : 记录层数*		flag: 记录是否平衡二叉树*/int isBalance(Node *node, int l, bool &flag){if (node == nullptr){return l;}int left = isBalance02(node->left_, l + 1, flag);int right = isBalance02(node->right_, l + 1, flag);if (abs(left - right) > 1){flag = false;}return max(left, right);}

8 二叉树镜像翻转问题

问题描述:求镜子中的二叉树。
思想:递归处理遍历节点时候,交换根节点的左右节点。
在这里插入图片描述

	/*	功能:求镜子中的二叉树*	思想:节点的左右孩子交换位置*	参数:*		  Node: 当前节点*/void mirror01(Node *node){if (node == nullptr){return;}// 处理V节点Node *tmp = node->left_;node->left_ = node->right_;node->right_ = tmp;mirror01(node->left_);mirror01(node->right_);}

9 求中序遍历倒数第K个节点

思想:将中序遍历LVR 转为 RVL,将求倒数第K个节点转为在RVL中求正数第k个节点

	/*	功能:求中序倒数第K个节点*	思想:将中序遍历LVR 转为 RVL,将求倒数第K个节点转为在RVL中求正数第k个节点*	参数:*		 node : 节点*		    k : 找到正数第K个元素*/int i = 1;Node *getVal(Node * node, int k){if (node == nullptr){return nullptr;}Node *right = getVal(node->right_, k);	// Rif (right != nullptr)					// V{return right;}if (i++ == k){return node;}return getVal(node->left_, k);			// L}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud 组件Gateway服务网关【gateway快速入门】

目录 1&#xff1a;Gateway服务网关 1.1&#xff1a;为什么需要网关 1.2&#xff1a;gateway快速入门 1&#xff09;&#xff1a;创建gateway服务&#xff0c;引入依赖 2&#xff09;&#xff1a;编写启动类 3&#xff09;&#xff1a;编写基础配置和路由规则 4&#xf…

亮相2022南京软博会,创邻科技携Galaxybase图平台展现信创硬核实力

11月23日&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;以下简称”软博会“&#xff09;在南京博览中心隆重开幕。此次展会以“软件赋能 数智转型”为主题&#xff0c;由江苏省工业和信息化厅、南京市人民政府、中国工业技术软…

格式化DataFrame中的时间数据DataFrame.to_datetime()方法

小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 格式化DataFrame中的时间数据 DataFrame.to_datetime()方法 选择题 关于以下python代码说法错误的一项是? import pandas as pd data {"Date": [2022/12/01,2022/12/02]} df pd…

JavaScript高级复习下(60th)

1、函数内 this 的指向 2、严格模式 1、什么是严格模式 JavaScript 除了提供正常模式外&#xff0c;还提供了 严格模式&#xff08;strict mode&#xff09;。ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。 严格模式…

【面试宝典】Java八股文之Redis面试题

Redis面试题1、什么是 Redis?2、Redis 与其他 key-value 存储有什么不同?3、Redis 的数据类型?4、使用 Redis 有哪些好处?5、Redis 相比 Memcached 有哪些优势?6、Memcache 与 Redis 的区别都有哪些?7、Redis 是单进程单线程的?8、一个字符串类型的值能存储最大容量是多…

信创产业多点开花,AntDB数据库积极参与行业标准研制,协同价值链伙伴共促新发展

11月&#xff0c;AntDB数据库积极参与多项数据库行业标准研讨会&#xff0c;助推行业规范建立&#xff1b;凭借领先的技术研发能力与企业创新能力&#xff0c;在今年9月入选了《2022爱分析数据智能厂商全景报告》&#xff0c;此次又凭借在信创市场的深入推广&#xff0c;入选《…

【LeetCode每日一题:809.情感丰富的文字~~~双指针+计数器】

题目描述 有时候人们会用重复写一些字母来表示额外的感受&#xff0c;比如 “hello” -> “heeellooo”, “hi” -> “hiii”。我们将相邻字母都相同的一串字符定义为相同字母组&#xff0c;例如&#xff1a;“h”, “eee”, “ll”, “ooo”。 对于一个给定的字符串 S…

101个CV模型集体开源,魔搭社区视觉AI深度解析

作者&#xff1a;谢宣松 达摩院开放视觉智能团队 11月3日&#xff0c;在2022云栖大会上&#xff0c;阿里达摩院联手 CCF 开源发展委员会共同推出了 AI 模型社区“魔搭”ModelScope&#xff0c;旨在降低 AI 的应用门槛。 AI 模型较为复杂&#xff0c;尤其是要应用于行业场景&…

sklearn.metrics模块重要API总结(持续更新)

目录前言各类指标分类指标&#xff08;Classification metrics&#xff09;sklearn.metrics.accuracy_scoresklearn.metrics.aucaverage_precision_score (AP)回归指标&#xff08;Regression metrics&#xff09;多标签排序指标&#xff08;Multilabel ranking metrics&#x…

天宇优配|北上广深角逐“国字号”数据交易所 行业爆点

今日&#xff0c;上海数据生意地点揭牌一周年之际&#xff0c;将发动数据生意节&#xff0c;并将探究树立数交所国际板。10天前&#xff0c;深圳数据生意所正式揭牌。至此&#xff0c;北上广深四个一线城市均已树立数据生意所。 数据作为新型生产要素&#xff0c;正成为各地争相…

Linux登陆配置虚拟机

启用虚拟机一、启动虚拟机1、登录虚拟机2、查看IP地址3、能否PING通外网二、配置静态IP地址1、修改网卡配置文件2、重启网络服务3、重启虚拟机4、查看修改后的IP地址5、测试虚拟机能否Ping通外网三、测试宿主机与虚拟机能否相互Ping通1、测试宿主机能否Ping通虚拟机2、测试虚拟…

云原生系列 六【轻松入门容器基础操作】

✅作者简介&#xff1a; CSDN内容合伙人&#xff0c;全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;华为云享专家博主&#xff0c;掘金后端评审团成员 &#x1f495;前言&#xff1a; 最近云原生领域热火朝天&#xff0c;那么云原生是什么&#xff1f;何为云原生&a…

户外运动耳机如何选择、最优秀的五款户外运动耳机推荐

有些人花时间在户外纯粹是为了听听大自然的声音。其他人可能不想在没有娱乐或鼓舞人心的音频选择的情况下跑步、徒步、散步或骑自行车。找到适合锻炼的耳机相当简单&#xff0c;就像健身耳机一样&#xff0c;您会希望这些耳机能够舒适、安全地贴合您的耳朵&#xff0c;这样它们…

m基于PTS+TR的OFDM系统PAPR联合抑制算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 部分传输序列(Partial Transmit Sequence , PTS)由于其不受载波数量限制&#xff0c;并且能够有效的&#xff0c;无失真的降低OFDM信号峰均比&#xff0c;而受到广泛关注。部分传输序列算…

docker容器网络

第七章容器网络 Docker网络 veth pair&#xff1a;成对出现的一种虚拟网络设备&#xff0c;数据从一端进&#xff0c;从另一端出。用于解决网络命名空间之间隔离。 docker0&#xff1a;网桥是一个二层网络设备&#xff0c;通过网桥可以将Linux支持的不同端口连接起来&…

开源让这位 00 后逆袭成为各类大奖收割者

OpenI 启智社区在 2022 年推出的开源打榜活动&#xff0c;聚集了一帮非常活跃的开发者&#xff0c;上榜者覆盖了来自全国高校、科研机构、企业达 100 多家。其中&#xff0c;高校学生占 65%&#xff0c;近 60%的上榜者是 90 后&#xff0c;32%的上榜者是 00 后。真是 00 后浪推…

41、集合

一、基本介绍&#xff1a; 1、引入&#xff1a; &#xff08;1&#xff09;前面我们保存多个数据使用的是数组&#xff0c;但数组不足的地方有&#xff1a; 1&#xff09;长度开始时必须指定&#xff0c;而且一旦指定&#xff0c;不能更改 2&#xff09;保存的必须为同一类…

Socket网络编程

参考博客&#xff1a;https://blog.csdn.net/shuux666/article/details/124023652 1、环境查看 通过cmd窗口的命令:ipconfig查看本机IP地址 查看网络情况是否正常:ping百度官网 2、Socket概述 3、套接字建立连接过程 4、Socket网络编程 基本的Socket编程&#xff1a; 本实…

异常(Exception)

随着面向对象的结束&#xff0c;我们的JavaSE也就接近了尾声&#xff0c;还有两个章节没有去梳理&#xff0c;常用类和异常&#xff0c;本章先讲异常&#xff0c;剩下的常用类后面再来补。 废话不多说&#xff0c;直接开始本章的内容。 1. 认识异常 引出&#xff1a; 假设 n…

ArcGIS综合制图教程,简单上手!

目的 1、了解专题地图组成的各个要素&#xff1b; 2、掌握ArcGIS编辑专题图的方法和步骤&#xff1b; 实习内容 使用ArcGIS生成1&#xff1a;200万比例尺的浙江省县级行政区划图&#xff0c;并输出成像文件。 实习步骤 一、将ArcGIS切换到Layout视图&#xff0c;并调整页面…