本文共 3747 字,大约阅读时间需要 12 分钟。
欢迎转载,转载请务必注明出处:
马上找工作了,准备好好学习下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("\n反向打印双向链表:");        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);    }}   先这样,后面再看看有没有什么可以改进的地方。