二叉搜索树与双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。   解:这道题其实是一道中序遍历的题,需要注意的是把当前子树最大的节点返回到上一层。 下面解法中注意的是,第二个参数要加引用。因为我们需要返回上一个结点本身,而不是修改结点中的值。如果不加引用,第二个参数其实是一个复制的指针指向要返回的节点,而外层的指针并未改变,下面可以看一个例子
/*
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;
        ConvertImplement(pRootOfTree,pre);

        TreeNode* res = pRootOfTree;
        while(res ->left)
            res = res ->left;
        return res;
    };
    //pre返回为左子树最大的结点
    void ConvertImplement(TreeNode* pRootOfTree,TreeNode*& pre)
    {
        if(pRootOfTree==nullptr)
        {
            return;
        }
        
        ConvertImplement(pRootOfTree->left,pre);
        
        pRootOfTree->left=pre;
        
        if(pre)
        {
            pre->right=pRootOfTree;
        }
        pre=pRootOfTree;
        //右
        ConvertImplement(pRootOfTree->right,pre);
    }
};
void test(int *p, int *pre)
{
    pre = p;
}
int main()
{
    char *p = "12222";
    string s1(p, 2);
    son *s = new son;
    base *b=nullptr;
    delete(b);

    int i = 1;
    int *ptr = nullptr;
    test(&i, ptr);
}

这里的ptr还是nullptr

上一篇:使用Css和Div ”画“个三角形


下一篇:牛客网——剑指offer 二叉搜索树与双向链表