美文网首页
面试题36:二叉搜索树和双向链表

面试题36:二叉搜索树和双向链表

作者: scott_alpha | 来源:发表于2019-10-08 12:43 被阅读0次

    题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。假设左子树处理完了,就要处理根结点,而根结点必须知道左子树的最大结点,所以要用函数返回值记录下来;之后处理右子树,右子树的最小结点(也用中序遍历得到)要和根结点链接。
    思路:使用中序遍历(左中右),默认按照从小到大排列,
    解决方案:

    public class Question36 {
        static class BinaryTreeNode {
            int value;
            BinaryTreeNode left;
            BinaryTreeNode right;
    
            public BinaryTreeNode(int value) {
                this.value = value;
            }
        }
        public static BinaryTreeNode convert(BinaryTreeNode rootTree){
            if (rootTree == null) return null;
            BinaryTreeNode lastNodeInList = null;
            lastNodeInList = convertNode(rootTree, lastNodeInList);
            // 指向双向链表的尾节点,我们需要返回头节点
            BinaryTreeNode headOfList = lastNodeInList;
            while (headOfList != null && headOfList.left != null){
                headOfList = headOfList.left;
            }
            return headOfList;
    
        }
        private static BinaryTreeNode convertNode(BinaryTreeNode node, BinaryTreeNode lastNodeInList){
            // 处理左子树,获得最大节点
            BinaryTreeNode current = node;
            if(current.left != null){
                lastNodeInList = convertNode(current.left, lastNodeInList);
            }
            // 链接最大节点和根节点
            current.left = lastNodeInList;
            if (lastNodeInList != null){
                lastNodeInList.right = current;
            }
            // 处理右子树
            lastNodeInList = current;
            if (current.right != null){
                lastNodeInList = convertNode(current.right, lastNodeInList);
            }
            return lastNodeInList;
        }
    
        public static void main(String[] args) {
            BinaryTreeNode pHead = new BinaryTreeNode(1);
            BinaryTreeNode pAhead = new BinaryTreeNode(3);
            BinaryTreeNode pBhead = new BinaryTreeNode(5);
            BinaryTreeNode pChead = new BinaryTreeNode(7);
            BinaryTreeNode pDhead = new BinaryTreeNode(9);
            pHead.left = pAhead;
            pHead.right = pBhead;
            pBhead.left = pChead;
            pAhead.left = pDhead;
    
            System.out.println(convert(pHead).value);
        }
    }
    

    相关文章

      网友评论

          本文标题:面试题36:二叉搜索树和双向链表

          本文链接:https://www.haomeiwen.com/subject/zkyvpctx.html