剑指Offer(26):二叉搜索树与双向链表

一、题目描述

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


二、解题思路

二叉搜索树的特点:左结点的值 < 根结点的值 < 右结点的值,所以二叉搜索树中序遍历的序列,就是排序的顺序。
根据排序双向链表的定义,根结点将和它的左子树的最大一个结点链接起来,同时它还将和它右子树最小的结点链接起来。
在中序遍历过程中,当遍历到根结点时,它的左子树已经转换成一个排序的好的双向链表,并且当前指针指向链表中最后一个的结点。将其与根结点链接起来,此时根结点就成了最后一个结点,接着遍历右子树,并把根结点和右子树中最小的结点链接起来。

例如:
   [4]
 [2]   [6]
[1] [3] [5] [7]
排序的双向链表:{1 - 2 - 3} - 4 - {5 - 6 - 7}


三、编程实现

public class Solution {
    TreeNode preNode = null;
    TreeNode head = null;

    public TreeNode Convert(TreeNode pRootOfTree) {
        convertCore(pRootOfTree);
        return head;
    }

    private void convertCore(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
            return;
        }
        // 递归遍历左子树
        convertCore(pRootOfTree.left);
        if (preNode == null) {
            preNode = pRootOfTree;
            head = pRootOfTree;
        } else {
            // 将当前结点链接到前一个结点的右边
            preNode.right = pRootOfTree;
            // 将前一个结点链接到当前结点的左边
            pRootOfTree.left = preNode;
            // 将前一个结点指向当前结点
            preNode = pRootOfTree;
        }
        // 递归遍历右子树
        convertCore(pRootOfTree.right);
    }
}

猜你喜欢

转载自blog.csdn.net/Fan0628/article/details/88964893