排序二叉树转为双链表

描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
 
数据范围:输入二叉树的节点数 0 \le n \le 10000n1000,二叉树中每个节点的值 0\le val \le 10000val1000
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
 
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出
public TreeNode Convert(TreeNode pRootOfTree) {
        List<TreeNode> retList = new ArrayList<>();
        
        midTraverse(pRootOfTree, retList);
        if (retList.size() == 0) {
            return null;
        }
        if (retList.size() == 1) {
            return pRootOfTree;
        }
        
        TreeNode head = retList.get(0);
        int length = retList.size();
        int index = 0;
        TreeNode pre = null;
        while (index < length) {
            TreeNode cur = new TreeNode(retList.get(index).val);
            if (index == 0) {
                head = cur;
            } 
            if (pre != null) {
                pre.right = cur;
                cur.left = pre;
            }

            pre = cur;
            index++;
        }
        return head;
        
    }
    
    private static void midTraverse(TreeNode root, List<TreeNode> retList) {
        if (root == null) {
            return ;
        }

        midTraverse(root.left, retList);
        retList.add(root);
        midTraverse(root.right, retList);
    }

如果按照题目的要求,不创建新的节点,只在原树上进行改动,代码如下

//返回的第一个指针,即为最小值,先定为null
    public TreeNode head = null; 
    //中序遍历当前值的上一位,初值为最小值,先定为null
    public TreeNode pre = null;  
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null)
            //中序递归,叶子为空则返回
            return null;    
        //首先递归到最左最小值 
        Convert(pRootOfTree.left);
        //找到最小值,初始化head与pre
        if(pre == null){      
            head = pRootOfTree;
            pre = pRootOfTree;
        }
        //当前节点与上一节点建立连接,将pre设置为当前值
        else{      
            pre.right = pRootOfTree;
            pRootOfTree.left = pre;
            pre = pRootOfTree;
        }
        Convert(pRootOfTree.right);
        return head;
    }

 

posted on 2022-07-08 09:55  MaXianZhe  阅读(99)  评论(0编辑  收藏  举报

导航