剑指offer题目26:二叉搜索树与双向链表

题目描述

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

解答思路

二叉搜索树其实本身已经符合了排序的结构了,所以只需要把左子树的右指向根,根左指向右子树就好了,然而我还是太笨了,一时想不出。。

下面的代码中自己构建了一种结构体,分别指向排序后的子树的头节点和尾节点,这是因为如果是排序左子树的话,是需要知道左子树的尾部,然后和根相连,如果一个个遍历左子树去获取的话会比较费劲。

实现代码

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    struct SortList {
        struct TreeNode *head;
        struct TreeNode *tail;
        SortList(TreeNode *h, TreeNode *t) :
                head(h), tail(t) {
        }
    };

    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        SortList* list = ConvertSubTree(pRootOfTree);
        return list->head;
    }

    SortList* ConvertSubTree(TreeNode* node) {
        TreeNode *head = node;
        TreeNode *tail = node;

        if(node) {
            if(node->left) {
                SortList* list = ConvertSubTree(node->left);
                // 建立新的连接
                list->tail->right = node;
                node->left = list->tail;

                head = list->head;
            }

            if(node->right) {
                SortList* list = ConvertSubTree(node->right);
                list->head->left = node;
                node->right = list->head;

                tail = list->tail;
            }

        }
        
        return new SortList(head, tail);
    }

};
posted @ 2019-04-03 15:20  {-)大傻逼  阅读(155)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。