第1题:把二叉搜索树转换为一个排序的双向链表

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44494693

马上找工作了,准备好好学习下July大神整理的微软面试100题系列,代码使用Java实现(IntelliJ那个黑色主题真是程序员的大爱),顺便就复习一下Java和数据结构。闲话不多说,热腾腾的题和代码端上来。

第一题:把二叉搜索树转换为一个排序的双向链表
要求:不能创建新的节点,只能调整指针的指向
示例

从二叉搜索树的定义来看,root节点左子树上的值都是比它小的,右子树的值都是比它大的,所以变成双向链表后它的左邻居就应该是左子树中值最大的节点,右邻居就是右子树中值最小的节点。接下来就是递归求解实现了。

package Exam001;

/**
 * Created by cq on 2015/3/18.
 * 二叉搜索树节点定义
 */
public class BSTreeNode {
    private int value;
    private BSTreeNode left;
    private BSTreeNode right;
    public BSTreeNode getLeft() {
        return left;
    }
    public void setLeft(BSTreeNode left) {
        this.left = left;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public BSTreeNode getRight() {
        return right;
    }
    public void setRight(BSTreeNode right) {
        this.right = right;
    }
    public BSTreeNode(int value){
        this.value=value;
    }
}
package Exam001;

/**
 * Created by cq on 2015/3/18.
 * 第一题:把二叉搜索树转换为一个排序的双向链表
 * 要求:不能创建新的节点,只能调整指针的指向
 */
public class BSTree {
    public BSTreeNode bstree;
    //使用前序遍历打印二叉搜索树
    public void printBSTree(BSTreeNode bst){
        if (bst == null){
            return;
        }
        printBSTree(bst.getLeft());
        System.out.print(bst.getValue()+" ");
        printBSTree(bst.getRight());
    }
    public BSTreeNode getDualLinkedList(BSTreeNode bst){
        if (bst == null){
            return null;
        }
        tree2List(bst);
        return getMinNode(bst);
    }
    //二叉搜索树转为有序双向链表
    public void tree2List(BSTreeNode bst){
        if (bst == null){
            return;
        }

        if (bst.getLeft() != null){
            tree2List(bst.getLeft());
            bst.setLeft(getMaxNode(bst.getLeft()));
            bst.getLeft().setRight(bst);
        }
        if (bst.getRight() != null){
            tree2List(bst.getRight());
            bst.setRight(getMinNode(bst.getRight()));
            bst.getRight().setLeft(bst);
        }
    }
    //获取树中最大节点
    public BSTreeNode getMaxNode(BSTreeNode bst){
        if (bst == null){
            return null;
        }
        while (bst.getRight() != null){
            bst = bst.getRight();
        }
        return bst;
    }
    //获取树中最小节点
    public BSTreeNode getMinNode(BSTreeNode bst){
        if (bst == null){
            return null;
        }
        while (bst.getLeft() != null){
            bst = bst.getLeft();
        }
        return bst;
    }
    //打印双向链表
    public void printDualLinkedList(BSTreeNode dList){
        if (dList == null){
            return;
        }

        System.out.print("正向打印双向链表:");
        while(dList.getRight() != null){
            System.out.print(dList.getValue()+" ");
            dList = dList.getRight();
        }
        System.out.print(dList.getValue()+" ");

        System.out.print("
反向打印双向链表:");
        while (dList.getLeft() != null){
            System.out.print(dList.getValue()+" ");
            dList = dList.getLeft();
        }
        System.out.print(dList.getValue()+" ");

    }
    public static void main(String[] args){
        BSTree bst = new BSTree();
        bst.bstree = new BSTreeNode(10);
        BSTreeNode node2 = new BSTreeNode(6);
        BSTreeNode node3 = new BSTreeNode(14);
        BSTreeNode node4 = new BSTreeNode(4);
        BSTreeNode node5 = new BSTreeNode(8);
        BSTreeNode node6 = new BSTreeNode(12);
        BSTreeNode node7 = new BSTreeNode(16);
        bst.bstree.setLeft(node2);
        bst.bstree.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node3.setLeft(node6);
        node3.setRight(node7);

        System.out.print("前序遍历二叉搜索树:");
        bst.printBSTree(bst.bstree);
        System.out.println();

        BSTreeNode tmp = bst.getDualLinkedList(bst.bstree);
        bst.printDualLinkedList(tmp);
    }
}

先这样,后面再看看有没有什么可以改进的地方。

版权所有,转载请注明出处 http://www.cnblogs.com/read-the-spring-and-autumn-annals-in-night/
原文地址:https://www.cnblogs.com/read-the-spring-and-autumn-annals-in-night/p/12041995.html