題目描述
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
遞歸思路:
中序遍歷,記錄pre。左子樹走到頭的pre應該是null,所以初始pre=null,左子樹的pre是原來的左孩子, 右子樹的pre是它的父節點。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void BeList(TreeNode* root, TreeNode* &pre){
if(!root) return ;
BeList(root->left, pre);
root->left = pre;
if(pre) pre->right = root;
pre = root;
BeList(root->right, pre);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(!pRootOfTree)
return nullptr;
TreeNode* pre = nullptr;
TreeNode* res = pRootOfTree;
BeList(pRootOfTree, pre);
while(res->left)
res = res->left;
return res;
}
};
圖解: