1、把二元查找树转变成排序的双向链表

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板) 本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。 阅读详情

1. 把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};

 

思路:二元查找树的规律是做子树的所有节点小于根节点,右子树的所有节点大于根节点,可以推断出转成双向链表后,根节点的前一个节点为左子树的最大值,即左子树最右边的节点,根节点的后一个节点为右子树的最小值,即右子树最左边的节点。

利用树的递归的性质,每个非叶子节点都可以找到前节点和后节点。对于叶子节点,他的前节点 和 后节点肯定都不是叶子节点,所以可以用下面的伪代码来实现

void tranferToDoubleLinkedList(BSTreeNode *tree)

{
	if (tree->m_pLeft)
	{
		BSTreeNode *node = getMaxElement(tree->m_pLeft);

		tranferToDoubleLinkedList(tree->m_pLeft);

		tree->m_pLeft = node;
		node->m_pRight = tree;
	}

	if (tree->m_pRight)
	{
		BSTreeNode *node = getMinElement(tree->m_pRight);

		tranferToDoubleLinkedList(tree->m_pRight);

		tree->m_pRight = node;
		node->m_pLeft = tree;
	}
}


下面是完整的源码:

 

/*
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
*/

#ifndef INTERVIEW_1_H
#define INTERVIEW_1_H

class BSTreeNode
{
public:
	int m_nValue;
	BSTreeNode *m_pLeft;	// mapped to pre node when transferring to Double Liked List
	BSTreeNode *m_pRight;	// mapped to next node when transferring to Double Liked List
};

class BSTree
{
public:
	BSTree(BSTreeNode *node)
	{
		root = node;
	}

	BSTreeNode* GetMaxElement() const;
	BSTreeNode* GetMinElement() const;
	void GenerateDoubleLikedList();

private:
	BSTreeNode *root;
};

#endif //INTERVIEW_1_H


 

#include "Interview_1.h"
#include <iostream>

using namespace std;

BSTreeNode* BSTree::GetMaxElement() const
{
	if (root == NULL)
		return NULL;
	BSTreeNode* max = root;

	while(max->m_pRight)
	{
		max = max->m_pRight;
	}
	return max;
}

BSTreeNode* BSTree::GetMinElement() const
{
	if (root == NULL)
	{
		return NULL;
	}

	BSTreeNode *min = root;
	while(min->m_pLeft)
	{
		min = min->m_pLeft;
	}

	return min;
}

void BSTree::GenerateDoubleLikedList()
{
	if (root->m_pLeft != NULL)
	{
		BSTree leftTree(root->m_pLeft);
		BSTreeNode *pre = leftTree.GetMaxElement();
		root->m_pLeft = pre;

		leftTree.GenerateDoubleLikedList();
		pre->m_pRight = root;
	}
	
	if (root->m_pRight != NULL)
	{
		BSTree rightTree(root->m_pRight);
		BSTreeNode *next = rightTree.GetMinElement();
		root->m_pRight = next;
		rightTree.GenerateDoubleLikedList();
		next->m_pLeft = root;
	}
}


 

 

//原题目地址: http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
用于多种无人机协作的群体智能算法:综合综述 随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。 阅读详情

相关推荐

激光器安规详细解读 - 一级 - 并以940波长为例

前言: 作为人工智能的重要解决方案,激光作为不可或缺的一个选项。但是,激光的安规问题始终是要得到关注。尤其是3D识别技术在人脸上的使用的时候,如何判读激光器的安全使用规范,变得非常重要。本文,尝试从欧洲激光标准IEC 60825-1:2014,以及国家激光产品规则标准GB 7247.1,抛砖引玉,写出自己的理解。 本节,主要讨论,人脸识别需要符合的安全等级1: 1 激光标准的分类 激光国际...

山云的专栏 5002

1. 微软面试题:把二元查找树转变成排序双向链表

微软面试题集100题之1:把二元查找树转变成排序双向链表

我的技术生活 1793

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 459

程序员面试题精选(1):把二元查找树转变成排序双向链表

  题目:输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。要求不能创建任何新的结点,只调整指针的指向。  比如将二元查找树                                            10                                          /    /                                     

yysdsyl的专栏 5600

面试题01二元查找树转变成排序双向

目:输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。要求不能创建任何 新的结点,只调整指针的指向。 比如将二元查找树10 / \ 6 14 / \ / \ 4 8 12 16 转换双向链表 4=6=8=10=12=14=16#include <iostream> using namespace std;struct Node{ int value

yvhqbat的博客 479

每天学习一算法系列(2)(把二元查找树转变成排序双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序双向链表.)

题目: 把二元查找树转变成排序双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。 题目来自:http://topic.csdn.net/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html   思路: 一看到这样的问题首先想到的是二叉的遍历问题,具体是前序

yuucyf的专栏 4582

二元查找树转变成排序双向链表

微软面试100题第一题

breaking the habit 413

1.把二元查找树转变成排序双向链表

题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。     10      / \   6   14  / \    / \ 4 8 12 16 转换双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_n

MasaWong的专栏 640

(1)把二元查找树转变成排序双向链表

题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。    如:        10                    /      \               6          14             /    \         /    \         4        8   12    16

tongjianfeng的专栏 523

[1]把二元查找树转变成排序双向链表

【题目】输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。要求不能创建任何新的结点,只调整指针的指向。10//6     14//      //4   8   12   16转换双向链表4=6=8=10=12=14=16。【思路】按照二叉的中序正好按顺序遍历全部节点,在遍历的过程中,更改它的逻辑结构。【答案】// Exereise.cpp #include "stdafx.h" #include using namespace std; struc

1307

1题:把二元查找树转变成排序双向链表

题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换双向链表 4=6=8=10=12=14=16。 #include #include #include #include using namespace std; int findGre

Jastin7的专栏 294

No1、把二元查找树转变成排序双向链表

题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。      10    /       \  6       14 /    \    /    \ 4 8 12 16 转换双向链表 4=6=8=10=12=14=16。 个人想法: 看一下转化之后的双向链表的顺序,4、6、8、10、12、14、16,

whatsname的Blog 341

1.二元查找树转变成排序双向链表

1.把二元查找树转变成排序双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换双向链表 4=6=8=10=12=14=16。 首先:1.二叉的结构;2.二叉查找树的构建;3.中序遍历;4.转变为双向链表双向链表的前后结点可以

chqmrmex 727

练习1:把二元查找树转变成排序双向链表

1.把二元查找树转变成排序双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换双向链表 4=6=8=10=12=14=

sanpwy的专栏 316

1二元查找树转变成排序双向链表

题目: 二元查找树【百度百科】 它首先要是一棵二元,在这基础上它或者是一棵空;或者是具有下列性质的二元: 若左子不空,则左子上所有结点的值均小于它的根结点的值; 若右子不空,则右子上所有结点的值均大于它的根结点的值; 左、右子也分别为二元查找树 分析 根据二元查找树的特点可知:节点A的左子的值...

weixin_34380781的博客 95

全指标研究面板数据集(研究).xlsx

全指标研究面板数据集(研究).xlsx

西北工业大学数据结构实验报告

2022.4.12报告配套代码已经整理包含包含11数据结构实验报告以及配套代码,结构完整,符合要求,实验成绩97分。啰嗦几句:更加建议大家自己写,我这个更多的是自己的资源存档有问题的话私信,看到会回复关于代码,因为当时比较仓促,还没有进行整理关于查重,你现在看到的下载次数就是拥有我这份报告的人数给大家献丑了,希望大家都能取得好成绩!!!

上一篇: 编程之美 2.8 找符合条件的正数
下一篇: 2、设计包含min 函数的栈
qjt_uestc
博客等级 码龄16年 6粉丝 20原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值