剑指offer第26题:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
理解:
不能建立新的结点,只能改变指向,就是让left成为指向前一个的指针,right成为指向后一个的指针。由于是搜索二叉树,于是通过中序遍历+递归可以实现这个变化过程。
重要的是搞明白在互指的过程中pRoot和Head结点当前都指向的是哪一个,只要搞清楚了,只需要互指一下就可以了。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//因为要自写方法,创建两个共用成员
TreeNode Head = null; //影分身
TreeNode realHead = null; //真正的头
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null){
return null;
}
//递归调用
coreConvert(pRootOfTree);
return realHead;
}
public void coreConvert(TreeNode pRoot){
if(pRoot == null){
return ;
}
//中序遍历的过程,先是左子树,然后根,最后右子树
coreConvert(pRoot.left);
//如果Head和realHead还是空的说明是第一次,应该赋予pRoot
if(Head==null || realHead==null){
Head = pRoot;
realHead = pRoot;
}else{
//此时的pRoot指向的是当前自己,Head指向的是上一个根节点
Head.right = pRoot; //互指
pRoot.left = Head; //互指
Head = pRoot; //更新Head结点
}
coreConvert(pRoot.right);
}
}
知识点:
- 搜索二叉树;
- 中序遍历:根在中间被遍历;
- 递归;
- left,right指针成为指向前、后的指针