剑指Offer之二叉搜索树与双向链表

题目描述

  输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

基本思路

  假设二叉搜索树为{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;

    }
}
原文地址:https://www.cnblogs.com/lfeng1205/p/6858431.html