题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
基本思路
假设二叉搜索树为{10,6,14,4,8,12,16},按照中序遍历,当我们遍历转换到根节点(值为10的节点)时,它的左子树已经转换成一个排序的链表了,并且处在链表的最后一个节点是当前最大的节点。我们把值为8的节点和根节点链接起来,此时链表中的最后一个节点就是10了。接着我们去遍历转换右子树,并把根节点和右子树的最小的节点链接起来。转换左子树和右子树,使用递归的方法。
Java代码
package com.swordOffer.convertBinarySearchTree18;
/**
* Created by Feng on 2017/5/15.
* 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
* 要求不能创建任何新的结点,只能调整树中结点指针的指向。
*/
public class ConvertBinarySearchTree {
public static void main(String[] args) {
TreeNode node1 = new TreeNode(10);
TreeNode node2 = new TreeNode(6);
TreeNode node3 = new TreeNode(14);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(8);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
TreeNode result = convertNode(node1);
System.out.println(result.val);
}
public static TreeNode convertNode(TreeNode pRootOfTree) {
//如果根节点为空,返回空
if (pRootOfTree == null) {
return null;
}
//如果只有根节点
if (pRootOfTree.left == null && pRootOfTree.right == null) {
return pRootOfTree;
}
//转换左子树
TreeNode pLeft = convertNode(pRootOfTree.left);
TreeNode pNode = pLeft;
while (pNode != null && pNode.right != null) {
pNode = pNode.right;
}
if (pLeft != null) {
pNode.right = pRootOfTree;
pRootOfTree.left = pNode;
}
//转换右子树
TreeNode pRight = convertNode(pRootOfTree.right);
if (pRight != null) {
pRootOfTree.right = pRight;
pRight.left = pRootOfTree;
}
return pLeft != null ? pLeft : pRootOfTree;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}