将二叉排序树转为类链表,一种简单方法可以中序遍历将结果保存到数组中,遍历该数组创建类链表返回;该方法较为繁琐。
方法二:
在中序遍历过程中改变指针的指向使其左孩子的右指针指向父节点,父节点左孩子指针置空;因为中序遍历先为最左节点,左右孩子均为空,所以需要一个哑结点和一个指向当前孩子节点的指针;
然后从最左侧孩子开始,将哑结点右孩子指向根节点,根节点左孩子置空,当前节点向上移动到根节点;依次向上回溯改变指针指向,这里一个特殊情况,当node节点为temp的右子节点时,依旧正确,此时temp指向右孩子,向上回溯到祖父节点改变指向即可,中序遍历完成即为答案。
本博客源自力扣,对该题做进一步讲解,加深理解
class Solution {
private:
TreeNode *temp;
public:
void inorder(TreeNode *node) {
if(node == nullptr)return;
inorder(node->left);
//孩子节点右孩子指针指向父节点
temp->right = node;
//左节点置空
node->left = nullptr;
//移动临时指针,递归生成链表
temp = node;
inorder(node->right);
}
TreeNode* increasingBST(TreeNode* root) {
TreeNode *dumbNode = new TreeNode(-1);
temp = dumbNode;
inorder(root);
return dumbNode->right;
}
};