保存前一个节点,并在递归右子树之前更新(中序)
二叉搜索树与双向链表
http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5
核心转换过程:root.left=pre(向前),pre.right=root(向后)
二叉树保存前一个节点,pre.在遍历右子树之前更新!!pre=root,dfs(root.right)
/** * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 * @param pRootOfTree 二叉搜索树 * @return 排序的双向链表--,收尾节点的处理 */ public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null){ return null; } ConvertRecur(pRootOfTree); //牛客网提交时需要注销以下两行代码,直接返回this.head. this.head.left=pre; this.pre.right=head; return this.head; } private TreeNode pre=null; private TreeNode head=null; public void ConvertRecur(TreeNode root) { if(root==null){ return; } ConvertRecur(root.left); if(this.pre==null){ head=root; }else { this.pre.right=root; } //都会执行这语句。 root.left=this.pre; //记录前一个节点 pre=root; ConvertRecur(root.right); }