剑指Offer第二十六题:二叉搜索树与双向链表

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

解答:
1.思路:添加一个数组存放中序遍历的结果。

public class Q_26 {

List<TreeNode> list=new ArrayList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
    if(pRootOfTree==null){
        return null;
    }
    MidSort(pRootOfTree);
    return mangeList();
}
public void MidSort(TreeNode pRootOfTree) {
    if (pRootOfTree == null) {
        return;
    }
    MidSort(pRootOfTree.left);
    list.add(pRootOfTree);
    MidSort(pRootOfTree.right);
}
public TreeNode mangeList() {
    TreeNode pre = list.get(0);
    TreeNode tmp;
    for (int i = 1; i < list.size(); i++) {
        tmp = list.get(i);
        tmp.left = pre;
        pre.right = tmp;
        pre = tmp;
    }
    return list.get(0);
}

}

2.这个方法不需要创建数组
public class Q_26 {

/**
 * 参照:https://blog.nowcoder.net/n/7ada22418aba4e01be27ef38d557a41c?f=comment
 * 思路:设立一个从尾部遍历到头部的pre节点,在每次递归的时候,把当前节点和pre节点的顺序设置好,然后把pre节点向前移动一个
 */
TreeNode pre = null;
List<TreeNode> list = new ArrayList<>();

public TreeNode Convert(TreeNode pRootOfTree) {
    if (pRootOfTree == null) {
        return null;
    }
    Convert(pRootOfTree.right);
    if (pre == null) {
        pre = pRootOfTree;
    } else {
        pre.left = pRootOfTree;
        pRootOfTree.right = pre;
        pre = pRootOfTree;
    }
    Convert(pRootOfTree.left);
    return pre;
}

}

全部评论

相关推荐

如题,求问华为1145和25定律是什么意思?刷到好多人说这个东西了,不知道什么意思
我能加班:如果你在主管面试完当天晚上11点45分收到面试反馈邮件的话,大概率是通过主管面试了。25小时是指在你主管面完成收到短信后的25小时你可以在官网查到你是不是通过。 应该是这样
点赞 评论 收藏
分享
09-17 20:37
已编辑
长沙学院 Java
涂莱:学院本重心后移,金10银11,甚至金11银12,战线拉长一点,对于学院本来说秋招是个持久战,加油吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
做个有文化的流氓:Offer收割机
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务