题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
模版:
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
//…
}
}
分析:二叉搜索树中序遍历的结果就是一个排好的数列。想连成链表只要把当前节点跟之前的节点连接,最后返回最左边的节点即可。
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return null;
Convert(pRootOfTree.left);
//在这里pRootOfTree即表示当前节点.,第一次到这里时是最左边的节点,第二次是其父节点…
Convert(pRootOfTree.right);
}
如上是必须有的代码,然后想获得最左边的节点因为要获得一个返回的句柄,所以先设置一个全局的pre为null,如果为null就把当前的值给它,首次执行到这里就把最左边的节点给它.
TreeNode root = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return null;
Convert(pRootOfTree.left);
//在这里pRootOfTree即表示当前节点.,第一次到这里时是最左边的节点,第二次是其父节点…
if(root == null){
root = pRootOfTree;
}
Convert(pRootOfTree.right);
return root;
}
剩下的就是连接链表的问题了, 这需要一个pre变量记录上一个节点,开始时就是最左边的节点,然后把它和当前的连接起来,连接后就变成当前节点。
TreeNode root = null;
TreeNode pre = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return null;
Convert(pRootOfTree.left);
//在这里pRootOfTree即表示当前节点.,第一次到这里时是最左边的节点,第二次是其父节点…
if(root == null){
pre=root = pRootOfTree;
}
else{
pre.right = pRootOfTree;
pRootOfTree.left = pre;
pre = pRootOfTree;
}
Convert(pRootOfTree.right);
return root;
}