二叉搜索树与双向链表(没有优化的时间效率比较低)

package niuke;

public class SearchTreenode1 {
    
     public static void main(String[] args) {
        
    }
     public TreeNode Convert(TreeNode pRootOfTree) {
          /* 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。*/
          /*对于第16行代码到第30行代码,当使用递归就把已经递归的结果当做一个双向链表来看了,就用以实现的最理想的状态来对待,。
           * 对于第12行代码到第16行代码则就是递归到最后一步的时候应该想到的情况
           * 整体的思想就是如果是单纯的只有3个节点的树的话,左边要的是一个点,但是必须调用递归的结果还是那一个点,是怎么做的。但是如果把左节点想成一个树,结果应该的返回的是什么结果,如果把右节点想成一个树,应该返回的是什么结果
           * 然后建立连接,这是又要想这时返回给上一级递归的是什么,如果已经完成的这棵树是左子树应该返回什么,是右子树应该返回什么*/
         //中序遍历的递归算法,本人认为递归算法写的时候,首先想到如果这是最后一个节点最后一个树,最简单的情况,这时候要怎么写,还要想到,如果返回的是一个大树,要怎么写
         if(pRootOfTree == null)         //如果是空节点则返回空节点
             return null;
        if(pRootOfTree.left == null &&  pRootOfTree.right == null) {  //如果左端是叶子节点,也是递归到最后的情况,也是要想到的最简单的情况
            return pRootOfTree;
        }
        TreeNode left = Convert(pRootOfTree.left);     //如果左端是个树,好了那就直接推给递归去做,这时候必须要保证递归左树返回的是,左树的最后节点
        TreeNode p = left;
        while( p != null && p.right != null) {         //则就承接了上2行代码,这你想到返回的p是不断递归之后的结构,已经构成了双向链表所以一直取右节点找到右节点
                                                       
            p = p.right;
        }
        if(left != null) {
            p.right = pRootOfTree;                   //这就是建立连接,把根节点与左子树建立联系
        }
        TreeNode right = Convert(pRootOfTree.right);  //然后调用递归把右子树进行递归返回其头结点
        if(right != null) {
            right.left = pRootOfTree;                //把根节点与右子树建立联系
            pRootOfTree.right = pRootOfTree;
        }
        return left!=null?left:pRootOfTree;          //当左子树为空时,则返回根节点,不然返回左子树
         
     }
}
 

猜你喜欢

转载自blog.csdn.net/ZWB626/article/details/84241106