保存前一个节点,并在递归右子树之前更新(中序)
二叉搜索树与双向链表
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);
}
