题目
题号:26
题目名:二叉搜索树与双向链表
编程语言
Java
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
初次思路
二叉搜索树的中序遍历就是递增的
中序遍历是,左根右的遍历
那么只要把二叉搜索树进行递归,然后重构一个双向链表就行
重点有:在遍历的时候要将前置结点连向当前结点,当前节点的前驱连向前置结点,然后再将前驱后移,换下一个结点
这里有一个疑惑?双向链表不是要头结点前驱连向尾巴结点,尾巴结点后继连向头结点???为什么写进去以后就会死循环??不知道是不是我写错了,扔进去力扣试了下是对的,但是牛客会一直说内存溢出,这个有待商榷.
//中序遍历完以后,pre指针会指向链表末尾,也就是最大的数,也就是树的最右下的结点(牛客不用连????)
//pre.right = head;//尾节点后继指向头结点
//head.left = pre;//右节点前驱指向尾节点
解题代码
public class Solution {
TreeNode pre = null;//设置前驱
TreeNode head = null;//设置头结点
public TreeNode Convert(TreeNode pRootOfTree) {
/**
* 1.中序遍历二叉搜索树
* 2.给每个节点连接前后关系,头结点前驱是尾巴,尾节点后继是头
*/
//非空校验
if (pRootOfTree == null) return null;
dfs(pRootOfTree);//对二叉搜索树进行中序遍历
//中序遍历完以后,pre指针会指向链表末尾,也就是最大的数,也就是树的最右下的结点(牛客不用连????)
//pre.right = head;//尾节点后继指向头结点
//head.left = pre;//右节点前驱指向尾节点
return head;
}
//左 根 右进行中序遍历
private void dfs(TreeNode root) {
if (root == null) return;
dfs(root.left);//先遍历左左子树
if (pre == null) {
head = root;//如果前驱没有指向,说明还在头结点遍历
pre = root;//如果前驱没有指向,说明还在头结点遍历
}
else {
pre.right = root;//否则,当前结点是前驱结点的后继
root.left = pre;//因为是双向链表,当前结点的前驱要有指向
pre = root;//处理完当前结点,就将前驱结点后移
}
dfs(root.right);//处理右子树
}
}
算法练习代码我都开源在码云上,有需要的朋友可以看看