有序单链表转换成二叉平衡搜索树

题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

关键词:有序单链表、二叉平衡搜索树

二叉树搜索:对于所有节点,顺序是:left children <= current node <= right children;
平衡vs.非平衡:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树;

解题思路:在链表中,先通过快慢指针将树的根节点找到,返回后再递归构建出二叉平衡搜索树。 由于二叉排序树的中序遍历即有序,也就是与本题中的单链表从头到尾遍历相同,所以可以按照类似中序遍历的做法。

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */
class Solution {
public:
    ListNode* cutAtMid(ListNode* head)
    {
        typedef ListNode Node;
        if(head==NULL)
            return NULL;
        Node* fast=head;
        Node* slow=head;
        Node* prev=NULL;
      //prev指针的目的是把链表断开,保证slow之前为一个链表,slow之后为一个链表
        //使得在递归的时候求左子树时,head就为头到slow前一个
        while(fast!=NULL&&fast->next!=NULL)
        {
            prev=slow;
            slow=slow->next;
            fast=fast->next->next;
        }
        prev->next=NULL;
        return slow;
    }
    TreeNode *sortedListToBST(ListNode *head) {
        if(head==NULL)
            return NULL;
        if(head->next==NULL)
        {
            return new TreeNode(head->val);
        }
        ListNode* mid=cutAtMid(head);

        TreeNode *root=new TreeNode(mid->val);
        root->left=sortedListToBST(head);
        root->right=sortedListToBST(mid->next);

        return root;
    }
};
    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/Blessing_zf/article/details/80647598
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞