题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解法:主要应用到二叉树的中序遍历。将左子树遍历进行不断压栈,然后再出栈。用两个指针,current指向当前的树的节点,pre指向前一个节点,然后进行改指针引用,把压栈的节点进行出栈,并且在最后进行右子树是否存在的判断,这样才能够中序遍历。主要思想就是中序遍历。其余的就是一个改指针引用。没啥难度。理解中序遍历才是关键。
/*
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)
{
TreeNode* pre = NULL;
TreeNode* current = pRootOfTree;
TreeNode* root;
if(pRootOfTree == NULL) return NULL;
stack<TreeNode*> s;
bool isFirst = true;
while(current != NULL || !s.empty()) {
while(current != NULL) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
if(isFirst) {
root = current;
pre = root;
isFirst = false;
}
else {
pre->right = current;
current->left = pre;
pre = current;
}
current = current->right;
}
return root;
}
};