[程序员面试题精选100题(01)]-二叉查找树转成排序的双向链表

本文详细解析了一道来自微软的面试题,主题是如何将二叉查找树转换为排序的双向链表。通过递归中序遍历的方法,实现了树到链表的高效转换,并介绍了两种不同的实现策略,包括标记左子树与右子树,以及采用中序遍历记录链表队尾节点的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来自网络,声称这是一道微软的面试题。

先来看看题目:

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

比如将二叉查找树
        10
       /    \
  6          14
  /  \       /  \

4     8  12    16
 转换成双向链表
   4=6=8=10=12=14=16。

仔细分析一下,这并不是一道难题。

回忆一下二叉查找树(binary search tree),如果采用中序遍历,就可以得到有序的遍历结果。

于是,选用递归类似中序遍历的方式来解决这个问题

(1)左子树转化成排序的双向链表

(2)左子树的最后一个结点与根结点双向链接

(3)右子树转化成排序的双向链表

(4)根节点与右子树的第一个结点双向链接

代码如下:

#include <stdlib.h>
#include <stdio.h>

typedef struct SNode{
	SNode* left;
	SNode* right;
	int value;
	SNode(int v_):left(NULL),right(NULL){value = v_; }
}Node;

Node* convert_2_double_link_list(Node * root)
{
	if (!root) return NULL;
	Node* pre = convert_2_double_link_list(root->left);
	if (pre) {
		//find the end of list
		Node* p = pre;
		while(p->right != NULL) {
			p = p->right;
		}
		root->left = p;
		p->right = root;
	} else {
		pre = root;
		root->left = NULL;
	}
	Node * post = convert_2_double_link_list(root->right);
	
	if (post) {
		post->left = root;
		root->right = post;
	} else {
		root->right = NULL;
	}
	return pre;
}

void visit(Node* p)
{
	while (p){
		printf("%d->\n",p->value);
		p = p->right;
	}

}
int main()
{
	Node * root = new Node(10);
	Node * r11 = new Node(6);
	root->left = r11;
	Node * r12 = new Node(14);
	root->right = r12;
	Node * r21 = new Node(4);
	r11->left = r21;
	Node * r22 = new Node(8);
	r11->right = r22;

	Node * r31 = new Node(12);
	r12->left = r31;
	Node * r32 = new Node(16);
	r12->right = r32;

	Node* p = convert_2_double_link_list(root);
	visit(p);
	//system("pause");
	return 0;
}

解答完毕之后看到这篇文章的解法

http://blog.youkuaiyun.com/sjf0115/article/details/7707647

这个blog中提到了2种不同的实现方法,甚好:

(1)第一种与本文中的方法相似,不过文中,标记了是左子还是右子,来决定最后返回部分排序好的头节点还是尾节点。

(2)第二种方式,就是直接采取中序遍历,用一个指向双向链表队尾的指针记录中序遍历访问的节点。


内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值