2021-06-02:给定一棵搜索二叉树头节点,转化成首尾相接的有序双向链表。
2021-06-02:给定一棵搜索二叉树头节点,转化成首尾相接的有序双向链表。
福大大 答案2021-06-02:
二叉树递归。左子树串完,右子树串完,最终串自己。
代码用golang编写。代码如下:
package mainimport "fmt"func main() {head := &Node{Val: 5}head.Left = &Node{Val: 3}head.Left.Left = &Node{Val: 1}head.Left.Right = &Node{Val: 4}head.Right = &Node{Val: 7}head.Right.Left = &Node{Val: 6}head.Right.Right = &Node{Val: 8}ret := treeToDoublyList(head)for i := 0; i < 20; i++ {fmt.Println(ret)ret = ret.Right}}type Node struct {Val intLeft *NodeRight *Node}func treeToDoublyList(head *Node) *Node {if head == nil {return nil}allInfo := process(head)allInfo.End.Right = allInfo.StartallInfo.Start.Left = allInfo.Endreturn allInfo.Start}type Info struct {Start *NodeEnd *Node}func process(X *Node) *Info {if X == nil {return &Info{}}lInfo := process(X.Left)rInfo := process(X.Right)if lInfo.End != nil {lInfo.End.Right = X}X.Left = lInfo.EndX.Right = rInfo.Startif rInfo.Start != nil {rInfo.Start.Left = X}// 整体链表的头 lInfo.start != null ? lInfo.start : X// 整体链表的尾 rInfo.end != null ? rInfo.end : Xreturn &Info{twoSelectOne(lInfo.Start != nil, lInfo.Start, X), twoSelectOne(rInfo.End != nil, rInfo.End, X)}}func twoSelectOne(c bool, a *Node, b *Node) *Node {if c {return a} else {return b}}
执行结果如下:
***
[左神java代码](https://gitee.com/moonfdd/coding-for-great-offer/blob/main/src/class10/Code04_BSTtoDoubleLinkedList.java)
