题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:
对于二叉搜索树,用中序搜索算法挺适合。考虑每个子树子节点作为三部分,这里以根结点为特殊例子进行阐述
递归实现,每次用一个lastNode存放上一个子树的最后一个结点,该结点是上个已排好子树的最大的结点。
因此此时对于结点10来说,只需要建立与8之间的联系。
代码如下:
<span style="font-size:14px;">public TreeNode Convert(TreeNode pRootOfTree) {
//按照中序遍历的方式递归
TreeNode p=pRootOfTree;
TreeNode lastNode=null;
MiddleFind(p,lastNode);
//lastNode现在指向了最后的结点
while(lastNode!=null&&lastNode.left!=null){
lastNode=lastNode.left;
}
return lastNode;
}
public void MiddleFind(TreeNode p,TreeNode LastNode) {
if(p==null) return;
MiddleFind(p.left,LastNode);
//对每个结点类似中序进行操作,每次只管左边的两个链
p.left=lastNode;
if(lastNode!=null)
lastNode.right=p;
lastNode=p;
MiddleFind(p.right,LastNode);
}</span>
这样不知道为嘛lastNode的值传不过来,java 中对象的传递不是传地址,形参变化会影响实参么,感觉有点奇怪,于是改动了下
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode lastNode=null;//指向上一个子树的,设为全局的(奇怪,java中对象也是引用呀)
public TreeNode Convert(TreeNode pRootOfTree) {
//按照中序遍历的方式递归
TreeNode p=pRootOfTree;
// TreeNode lastNode=null;
MiddleFind(p);
//lastNode现在指向了最后的结点
while(lastNode!=null&&lastNode.left!=null){
lastNode=lastNode.left;
}
return lastNode;
}
public void MiddleFind(TreeNode p) {
if(p==null) return;
MiddleFind(p.left);
//对每个结点类似中序进行操作,每次只管左边的两个链
p.left=lastNode;
if(lastNode!=null)
lastNode.right=p;
lastNode=p;
MiddleFind(p.right);
}
}