美文网首页
Convert Sorted List to Binary Se

Convert Sorted List to Binary Se

作者: 余启涛 | 来源:发表于2019-03-16 16:26 被阅读0次

解决思路:

由于单链表是有序的,可以找到中间位置的元素,作为树的根节点,那么单链表的左半边就是左子树,右半边就是右子树,对于子树,同样是将一个单链表生成一个BST问题,递归方式即可解决问题。针对寻找单链表中的中间位置元素,可以使用两个指针遍历,slow每次走一步,fast每次走两步,fast走到链表尾,slow就是中间位置元素。

代码示例:

```

/**

* Definition for singly-linked list.

* type ListNode struct {

*    Val int

*    Next *ListNode

* }

*/

/**

* Definition for a binary tree node.

* type TreeNode struct {

*    Val int

*    Left *TreeNode

*    Right *TreeNode

* }

*/

func sortedListToBST(head *ListNode) *TreeNode {

    if head == nil {

        return nil

    }

    middle, pre := getMiddleAndPre(head)

// 如果前一个节点为nil,说明中间节点就是头节点,那么做左孩子应该为空,

//故设置head为nil, 递归调用;否则应该将链表断开

    if pre == nil {

        head = nil

    }else{

        pre.Next = nil

    }

    return &TreeNode{

        Val  : middle.Val,

        Left : sortedListToBST(head),

        Right: sortedListToBST(middle.Next),

    }

}

func getMiddleAndPre(head *ListNode) (middle, pre *ListNode) {

    slow := head

    fast := head

    for fast != nil && fast.Next != nil {

        pre = slow

        slow = slow.Next

        fast = fast.Next.Next

    }

//返回值为中间位置的节点和前一个节点,前一个节点用于断开单链表

//才能正确完成递归调用

    return slow, pre

}

```

相关文章

网友评论

      本文标题:Convert Sorted List to Binary Se

      本文链接:https://www.haomeiwen.com/subject/vaijmqtx.html