剑指offer题目26:二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解答思路
二叉搜索树其实本身已经符合了排序的结构了,所以只需要把左子树的右指向根,根左指向右子树就好了,然而我还是太笨了,一时想不出。。

下面的代码中自己构建了一种结构体,分别指向排序后的子树的头节点和尾节点,这是因为如果是排序左子树的话,是需要知道左子树的尾部,然后和根相连,如果一个个遍历左子树去获取的话会比较费劲。
实现代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
struct SortList {
struct TreeNode *head;
struct TreeNode *tail;
SortList(TreeNode *h, TreeNode *t) :
head(h), tail(t) {
}
};
TreeNode* Convert(TreeNode* pRootOfTree)
{
SortList* list = ConvertSubTree(pRootOfTree);
return list->head;
}
SortList* ConvertSubTree(TreeNode* node) {
TreeNode *head = node;
TreeNode *tail = node;
if(node) {
if(node->left) {
SortList* list = ConvertSubTree(node->left);
// 建立新的连接
list->tail->right = node;
node->left = list->tail;
head = list->head;
}
if(node->right) {
SortList* list = ConvertSubTree(node->right);
list->head->left = node;
node->right = list->head;
tail = list->tail;
}
}
return new SortList(head, tail);
}
};
作者:大傻逼
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号