[剑指Offer]36-二叉搜索树与双向链表

链接

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题意

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

解题思路

中序遍历,
若左子树不为空,找到!左子树转换成的链表的最后一个节点,并与根结点双向相连,
若右子树不为空,找到!右子树转换成的链表的首节点,并与根结点双向相连。
若左子树不空,返回左子树转成链表的首节点,否则,返回根节点。=》目标是返回整个链表的头部。

采用递归写法。

注意判空!
情景:当要访问一个节点的左孩子或右孩子时,当前节点是非空的吗?

其他知识

当要修改原指针指向的内存地址时,可函数传参 为TreeNode** pNode。

代码

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(!pRootOfTree){
            return nullptr;
        }
        
        if(!pRootOfTree->left&&!pRootOfTree->right){
            return pRootOfTree;
        }
        
        //找到左子树转换成的链表的最右节点,连上根节点
        TreeNode* pLeftList=nullptr;
        pLeftList=Convert(pRootOfTree->left);
        if(pLeftList){//
            TreeNode* p=pLeftList;
            while(p->right){//
                p=p->right;
            }
            pRootOfTree->left=p;
            p->right=pRootOfTree;
        }
        
        //找到右子树转换成的链表的最左节点,连上根结点
        TreeNode* pRightList=nullptr;
        pRightList=Convert(pRootOfTree->right);
        if(pRightList){
            TreeNode* p=pRightList;
            while(p->left){
                p=p->left;
            }
            pRootOfTree->right=p;
            p->left=pRootOfTree;
        }
        
        //返回链表
        if(pLeftList){
            return pLeftList;
        }
        else{
            return pRootOfTree;
        }
    }
};
原文地址:https://www.cnblogs.com/coding-gaga/p/10576967.html