首页 > 代码库 > 剑指Offer之二叉搜索树与双向链表

剑指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;    }}

 

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