剑指offer: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
递归做法:
* 将左子树转成一个左双向链表,并返回该链表的第一个节点(最左边的节点)
* 定位到左链表的最后一个节点(即左子树的最右节点)
* 如果左链表非空,将根的left指向左子树的最右节点,最右节点的right指向root
* 将右子树转成一个右双向链表,并返回链表的第一个节点
* 如果右链表非空,将root的right指向右链表的第一个节点,第一个节点的left指向root
public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null){ return null; } if(pRootOfTree.left==null && pRootOfTree.right==null){ return pRootOfTree; } TreeNode left=Convert(pRootOfTree.left); //将左子树转成一个左双向链表,且left指向的是左子树的最左节点 //下面去找左子树的最右节点 TreeNode p=left; while(p!=null && p.right!=null){ p=p.right; } if(left!=null){ pRootOfTree.left=p; p.right=pRootOfTree; } TreeNode right=Convert(pRootOfTree.right); //将右子树转成右双向链表 if(right!=null){ right.left=pRootOfTree; pRootOfTree.right=right; } return left!=null?left:pRootOfTree; }