/** * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 */ package javabasic.nowcoder; /* * 采用中序遍历 修改中序遍历,在其中加入一个前驱结点 遍历左子树 当前结点指向左指针指向前驱结点 前驱结点右指针指向当前结点 前驱 = 当前 遍历右子树 */ public class Main31 { //双向链表的左边头结点和右边头结点 TreeNode head = null; TreeNode realHead = null; public TreeNode Convert(TreeNode pRootOfTree) { ConvertSub(pRootOfTree); return realHead; } private void ConvertSub(TreeNode pRootOfTree) { //递归调用叶子节点的左右节点返回null if(pRootOfTree==null) return ; //第一次运行时,它会使最左边叶子节点为链表第一个节点 ConvertSub(pRootOfTree.left); if(head == null) { head = pRootOfTree; realHead = pRootOfTree; }else { //把根节点插入到双向链表的头结点,head向后移动 head.right = pRootOfTree; pRootOfTree.left = head; head = pRootOfTree; } //把右叶子节点也插入到双向链表 ConvertSub(pRootOfTree.right); } }