/*题目 * 二叉搜索树转换为双向链表 * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 * 比如输入下图中左边儿二搜索树,则输出转换后的排序双向链表。 * 4 / \ 2 5 / \ / \ 1 3 5 7 4=6=8=10=12=14=16 * */ /*思路 * 中序遍历就是有序的顺序,然后在遍历的过程中建立链表 * 利用一个lastlist 记录上次结点,然后递归中序遍历,结点左边等于上次结点, * 上次的结点等于当前结点cur,依次类推,直到树的最后的右结点,最后调整链表把头结点返回 * * */
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public TreeNode Convert(TreeNode pRootOfTree){
TreeNode lastlist = ConvertNode(pRootOfTree, null);
TreeNode pHead = lastlist;
while(pHead != null && pHead.left != null ){ //最后遍历完lastlist代表尾结点,所以需要反转返回头结点
pHead = pHead.left;
}
return pHead;
}
public TreeNode ConvertNode(TreeNode root,TreeNode lastlist){
if (root == null)
return null;
TreeNode cur = root;
if (cur.left != null){
lastlist = ConvertNode(cur.left, lastlist);
}
cur.left = lastlist; //当前结点 左指针 指向上次结点
if (lastlist != null){
lastlist.right = cur; //上次结点的 右指针指向 现结点
}
lastlist = cur; // 上次结点继续右移到 现结点
if (cur.right != null) {
lastlist = ConvertNode(cur.right, lastlist);
}
return lastlist;
}