题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
——来源于《剑指offer》
- 思路:
- 由于转换为双向链表之后的链表是排过序的,所以需要对二叉树进行中序遍历
- 根结点的左孩子要指向左子树的最大值,右孩子要指向有子树的最小值
- 注意:代码中的
pLastNodeList
不能设置为函数中的局部变量然后每次作为参数传递进去,原因可见这篇文章:由一道简单的LeetCode题引发对java中值传递的思考
- 代码实现:
package com.qianyu.jianzhioffer.convert;
/**
* @author lijing
* @date 2019-08-03 11:02
* @description 二叉搜索树变换为双向链表
*/
public class Solution {
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
// pLastNodeList指向双向链表的尾结点
private TreeNode pLastNodeList;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null || pRootOfTree.left == null && pRootOfTree.right == null) {
return pRootOfTree;
}
convertNode(pRootOfTree);
// 我们需要返回的是头结点
TreeNode pHeadList = pLastNodeList;
while (pHeadList.left != null) {
pHeadList = pHeadList.left;
}
return pHeadList;
}
private void convertNode(TreeNode pNode) {
if (pNode == null) {
return;
}
TreeNode pCurrent = pNode;
if (pCurrent.left != null) {
convertNode(pCurrent.left);
}
pCurrent.left = pLastNodeList;
if (pLastNodeList != null) {
pLastNodeList.right = pCurrent;
}
pLastNodeList = pCurrent;
if (pCurrent.right != null) {
convertNode(pCurrent.right);
}
}
}