剑指offer 30.二叉搜索树与双向链表

  1. 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
  2. 思路
    1. 减而治之,递归操作
    2. 假设左子树已经变成了一个排好序的双向链表,找到左子树的最后一个节点,与根节点建立双向关系
    3. 假设右子树已经变成了一个排好序的双向链表,右子树的第一个节点即根节点的下一个节点,与根节点建立双向关系
  3. 启发或者坑
    1. 需要明白递归返回的是排好序的双向链表的首节点。所以左子树对于根的前一个节点是最后一个节点,右子树对于根的后一个节点是第一个节点
  4. 代码
    /*
    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)
                return NULL;
            TreeNode* leftTemp = pRootOfTree->left;
            TreeNode* rightTemp = pRootOfTree->right;
            TreeNode* head = pRootOfTree;
            if (leftTemp) {
                head = Convert(leftTemp);
                TreeNode* lastLeftTemp= head;
                while(lastLeftTemp->right)
                    lastLeftTemp  = lastLeftTemp->right;
                pRootOfTree->left = lastLeftTemp;
                lastLeftTemp->right = pRootOfTree;
                 
            }
            if (rightTemp) {
                TreeNode* righthead = Convert(rightTemp);
                pRootOfTree->right = righthead;
                righthead->left = pRootOfTree;
            }
            return head;    
        }
    };
发布了131 篇原创文章 · 获赞 5 · 访问量 7396

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/103866229