排序二叉树转为双链表
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
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; }