二叉搜索树与双向链表
二叉搜索树与双向链表
http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5
(不开辟新的存储空间来完成二叉排序树向双向链表的转换)
大致思路:在中序遍历的过程中对每个节点的指针进行操作:完成对二叉排序树中元素从小到大的排序并且对每个遍历到的节点的指针进行修改。 **
** 借助一个指针指向每次遍历到的节点,下一次中序遍历到的节点的前驱便是此指针指向的节点,而此节点的后序是此时遍历到的节点。**
特点:此方法无需开辟新的数组空间来存储二叉排序树的元素顺序,可以在一次中序遍历完成后将二叉排序树改变成双向链表
注意事项:链表中指向最后一个节点的指针,当使用递归,且需要用具体变量保存每次递归的结果时,不能把此变量作为递归函数的形参,因为每次递归返回时此变量都会变为上层递归时此变量的值。所以这里的变量不作为inOrderConvert()的形式参数,而又由于在两个方法中都用到了此变量,所以将其定义在了所有方法的外面。
TreeNode lastNodeList = null; /** * @Author: ZwZ * @Description: 在中序遍历过程中对指针进行改变 * @Param: [pRootOfTree] * @return: jianZhi.TreeNode * @Date: 2020/1/27-16:19 */ public TreeNode Convert1(TreeNode pRootOfTree) { inOrderConvert(pRootOfTree); //寻找链表头节点 while (lastNodeList != null && lastNodeList.left != null) lastNodeList = lastNodeList.left; return lastNodeList; } /** * @Author: ZwZ * @Description: 中序遍历并改变指针 * @Param: [root] * @return: void * @Date: 2020/1/27-16:22 */ public void inOrderConvert(TreeNode root) { if (root == null) return; if (root != null) { inOrderConvert(root.left); root.left = lastNodeList; if (lastNodeList != null) lastNodeList.right = root; lastNodeList = root; inOrderConvert(root.right); } }