二叉搜索树与双向链表
二叉搜索树与双向链表
http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
public class Solution { //记录左子树的最右一个节点 有时候也指的是当前双链表的最后一个节点 protected TreeNode lastLeft = null; public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null) return null; if(pRootOfTree.left==null && pRootOfTree.right==null){ lastLeft = pRootOfTree;//最右侧的叶子节点 return pRootOfTree; } //将左子树构成双向链表(lastLeft会被更新),并返回 TreeNode leftList = Convert(pRootOfTree.left); //将根节点追加到左子树构成的双向链表之后 if(leftList != null){ lastLeft.right = pRootOfTree; pRootOfTree.left = lastLeft; } //当该树只有左子树,最后一个节点是根节点 lastLeft = pRootOfTree; //将右子树构成双向链表,在convert中lastLeft被更新成了右边链表的最后一个节点 TreeNode rightList = Convert(pRootOfTree.right); //将左边和右边连接起来 if(rightList != null){ rightList.left = pRootOfTree;//这里不是lastLeft,因为在最近一个convert()调用中已被更新 pRootOfTree.right = rightList; } return leftList==null?pRootOfTree:leftList; }