剑指offer二十六之二叉搜索树与双向链表

一、题目

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

二、思路

      对二叉搜索树中序遍历的结果即为排序的结果,在中序遍历的过程中,建立双向指针。详细过程见代码注释。

三、代码

public class Solution {

    TreeNode tempHead = null; //
    TreeNode realHead = null; //保存双向链表的头结点

    public TreeNode Convert(TreeNode pRootOfTree) {
        //如果头结点为空,返回null
        if (pRootOfTree == null) {
            return null;
        }

        //转换
        ConvertMethod(pRootOfTree);

        //返回双向链表的头结点
        return realHead;
    }

    //采用递归的方法进行中序遍历,遍历过程中,建立头结点和下一个节点的双向指针
    public void ConvertMethod(TreeNode pRootOfTree) {
        //递归遍历左节点
        if (pRootOfTree.left != null) {
            ConvertMethod(pRootOfTree.left);
        }

        //建立根节点与下一个节点的双向指针
        if(tempHead==null){    //第一次运行的时候,头结点为空,初始化头结点
            tempHead=pRootOfTree;//用于记录当前头结点
            realHead=pRootOfTree;//用于记录双向链表的头结点
        }else {  //第一次运行以后,建立tempHead节点与其下一个节点的双向指针
           //建立当前头结点与下一个节点的双向指针
            tempHead.right = pRootOfTree;
            pRootOfTree.left = tempHead;

            tempHead = pRootOfTree; //当前头节点后移一位
        }

        //递归遍历右节点
        if (pRootOfTree.right != null) {
            ConvertMethod(pRootOfTree.right);
        }

    }
}
View Code
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
View Code

------------------------------------------------------

参考链接:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5

posted @ 2017-10-11 13:14  AI菌  阅读(229)  评论(0编辑  收藏  举报