- 题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 代码
package main
import (
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
var pre *TreeNode
func Convert( pRootOfTree *TreeNode ) *TreeNode {
if pRootOfTree == nil {
return pRootOfTree
}
//递归处理
middleOrder(pRootOfTree)
//此时已经变为了双向链表,返回最左边的节点
//若题目要求为循环双向链表,再讲最左边和最右边的节点连起来即可
for pRootOfTree.Left != nil {
pRootOfTree = pRootOfTree.Left
}
//返回最左边的节点
return pRootOfTree
}
func middleOrder(root *TreeNode) {
//遇到空节点返回
if root == nil {
return
}
//一直向左走,走到最左边
middleOrder(root.Left)
//pre节点的轨迹就是访问节点的顺序,左节点->根节点->右节点
//在刚开始执行到最左边的节点时,pre为空,这是直接将根节点(最左边)赋值给pre
//后续pre即开始左->根->右依次遍历
if pre != nil {
root.Left = pre
pre.Right = root
}
pre = root
//遍历右节点
middleOrder(root.Right)
}
func main() {
root := &TreeNode{4, nil, nil}
node1 := &TreeNode{2, nil, nil}
node2 := &TreeNode{5, nil, nil}
node3 := &TreeNode{1, nil, nil}
node4 := &TreeNode{3, nil, nil}
root.Left = node1
root.Right = node2
node1.Left = node3
node1.Right = node4
head := Convert(root)
for head != nil {
fmt.Println(head.Val)
head = head.Right
}
}
是这个思路,这个题leetcode没有go语言选项,牛客网提交报奇怪的问题,服了。。。。