1、题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
2、分析
要将一个二叉搜索树变成一个有序的链表,那么应该想到的就是中序遍历,所有有关树的操作其实都会用到遍历这样的操作,而所谓的前中后几种遍历其实就是对当前节点的处理的程序放的位置不同而已。这道题牵扯到中序遍历,那么程序的结构就是左子树,然后一些操作,然后是右子树。至于到具体的操作,那么简单的画一个图,知道应该对节点指针怎么去变换就可以了。
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;
TreeNode* pre = nullptr;
convertHelper(pRootOfTree, pre);
TreeNode* res = pRootOfTree;
while(res ->left)
res = res ->left;
return res;
}
void convertHelper(TreeNode* cur, TreeNode*& pre)
{
if(cur == nullptr) return;
//左子树
convertHelper(cur ->left, pre);
//处理
cur ->left = pre;
if(pre) pre ->right = cur;
pre = cur;
//右子树
convertHelper(cur ->right, pre);
}
};
4、相关知识点
树的中序遍历。