二查搜索树与中序遍历

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向

模版:

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;

    }

点赞