二叉搜索树与双向链表
2020-07-07 本文已影响0人
UAV
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
https://blog.csdn.net/hly453/article/details/106180130
在中序遍历的时候当找到一个遍历节点的时候先将这个节点保存起来,然后遍历下一个节点的时候将之前保存的节点的right域指向下一个结点,下一个结点的left域指向上一个结点,然后将之前指向保存的指针指向当前这个结点。
/*
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)
{
//head 输出,pre记录上一次出栈值
TreeNode*head = NULL, *pre = NULL;
stack<TreeNode*>s;
//树不为空,或栈不为空
while (pRootOfTree||!s.empty())
{
//如果树不为空
while (pRootOfTree)
{
s.push(pRootOfTree);
pRootOfTree = pRootOfTree->left;
}
//如果栈不为空
if (!s.empty()) {
pRootOfTree = s.top();
s.pop();
if (pre!=NULL) {
pre->right = pRootOfTree;
pRootOfTree->left = pre;
}
else//pre为空,表示s第一次出栈,第一次出栈值为最左值,即输出值
{
head = pRootOfTree;
}
pre = pRootOfTree;
pRootOfTree = pRootOfTree->right;
}
}
return head;
}
};