题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
1.思路
中序遍历二叉树,在遍历的同时,对节点的left和right指针进行调整,有递归与非递归两种解法
3.代码
非递归:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr)
return nullptr;
stack<TreeNode*> s;
TreeNode* p = pRootOfTree;
TreeNode* pre = nullptr;
bool isFirst = true;
while(p != nullptr || !s.empty()) {
while(p != nullptr) {
s.push(p);
p = p->left;
}
p = s.top(); s.pop();
if(isFirst) {
pRootOfTree = p;
pre = pRootOfTree;
isFirst = false;
} else {
pre->right = p;
p->left = pre;
pre = p;
}
p = p->right;
}
return pRootOfTree;
}
};递归版:/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) {
return nullptr;
}
if(pRootOfTree->left == nullptr && pRootOfTree->right == nullptr) {
return pRootOfTree;
}
//将左子树构造成双链表,并返回链表头结点
TreeNode* left = Convert(pRootOfTree->left);
TreeNode* p = left;
//定位左子树双链表的最后一个结点
while(p != nullptr && p->right != nullptr) {
p = p->right;
}
//如果左子树链表不为空的话,将当前root追加到左子树链表
if(left != nullptr) {
p->right = pRootOfTree;
pRootOfTree->left = p;
}
//将右子树构造成双链表,并返回链表头节点
TreeNode* right = Convert(pRootOfTree->right);
//如果右子树链表不为空的话,将该链表追加到root节点之后
if(right != nullptr) {
right->left = pRootOfTree;
pRootOfTree->right = right;
}
return left == nullptr ? pRootOfTree : left;
}
};3.总结
清楚二叉树先序遍历中序遍历的非递归写法;关于递归求解,要清楚递归过程中的具体过程、返回值和终止条件。
本文介绍如何将二叉搜索树转换为排序的双向链表,提供递归与非递归两种方法,详细解释了每种方法的实现思路与代码实现。

2170

被折叠的 条评论
为什么被折叠?



