题目链接:
- 牛客网:二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
题解:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Convert(pRootOfTree)
{
// write code here
// 定义头结点和前驱结点
let head = null, pre = null
// 中序遍历的递归函数
function MediumOrderDFS(cur) {
// 如果当前结点为空,直接返回
if (cur === null) return
// 递归遍历左子树
MediumOrderDFS(cur.left)
// 处理当前结点
if (pre === null) {
// 如果前驱结点为空,说明当前结点是最左边的结点,将其设置为头结点
head = cur
} else {
// 否则,将前驱结点的右指针指向当前结点
pre.right = cur
}
// 将当前结点的左指针指向前驱结点
cur.left = pre
// 更新前驱结点为当前结点
pre = cur
// 递归遍历右子树
MediumOrderDFS(cur.right)
}
MediumOrderDFS(pRootOfTree)
// 返回转换后的链表头结点
return head
}
总结:
Convert(pRootOfTree) 函数接收一个二叉搜索树的根节点 pRootOfTree 作为参数,返回转换后的双向链表的头节点。
在函数内部,我们定义了两个变量 head 和 pre,分别表示双向链表的头节点和前一个节点。
紧接着是 MediumOrderDFS(cur) 函数的定义,它是一个中序遍历的递归函数,用来遍历二叉树并完成双向链表的转换。参数 cur 表示当前处理的节点。
在 MediumOrderDFS 中,首先进行递归的左子树遍历:MediumOrderDFS(cur.left);
接着是处理当前节点的逻辑:
如果 pre === null,说明当前节点是最左边的节点,将其设为头节点 head = cur; - 否则,将前驱节点的右指针指向当前节点 pre.right = cur;
将当前节点的左指针指向前驱节点 cur.left = pre;
更新前驱节点为当前节点 pre = cur;
- 最后进行递归的右子树遍历:MediumOrderDFS(cur.right);
- 函数执行完毕后,返回头节点 head,即为转换后的双向链表的头。