zoukankan      html  css  js  c++  java
  • 刷题--将搜索二叉树转换成双向链表

    【题目】

      对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有

      相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。

    【解答思路1】

      使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N)

    【解答思路2】

      使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度;

     1 public class TreeNode {
     2     public int val;
     3     public TreeNode left = null;
     4     public TreeNode right = null;
     5 
     6     public TreeNode(int val) {
     7         this.val = val;
     8     }
     9   }
    10   
    11   // 二叉搜索树转换成双向链表--用递归
    12     public static TreeNode biSearchTreeToBidirectionlinkList(TreeNode head){
    13         if(head == null)
    14             return null;
    15         TreeNode tail = bstTolist(head);
    16         head = tail.right;
    17         tail.right = null;
    18         return head;
    19     }
    20 
    21     // 二叉搜索树转换成双向链表的递归函数
    22     public static TreeNode bstTolist(TreeNode head){
    23         if(head == null)
    24             return null;
    25 
    26         TreeNode leftE = bstTolist(head.left);
    27         TreeNode rightE = bstTolist(head.right);
    28         TreeNode leftS = leftE.right;
    29         TreeNode rightS = rightE.right;
    30 
    31         if(leftE!=null && rightE!=null){
    32             leftE.right = head;
    33             head.left = leftE;
    34             rightS.left = head;
    35             head.right = rightS;
    36             rightE.right = leftS;
    37             return rightE;
    38         }
    39         else if(leftE != null){
    40             leftE.right = head;
    41             head.left = leftE;
    42             head.right = leftS;
    43             return head;
    44         }
    45         else if(rightE != null){
    46             rightS.left = head;
    47             head.right = rightS;
    48             rightE.right = leftS;
    49             return rightE;
    50         }
    51         else{
    52             head.right = head;
    53             return head;
    54         }
    55     }
    View Code
    【题目】
      对二叉树的节点来书,有本身的值域,有指向左孩子和右孩子的指针;对双链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有
      相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。
      【解答思路1】
      使用辅助队列,先遍历二叉搜索树,将节点存入一个队列,再依次出队中元素,将先后出队的节点前后链接起来。时间复杂度为O(N),空间复杂度为O(N)
      【解答思路2】
      使用递归,直接在二叉搜索树上修改指针,不需要使用辅助队列,时间复杂度是O(n),空间复杂度是树的高度;
  • 相关阅读:
    【修正】gooogleman嵌入式联盟部分图标,并增加gooogleman名片(20101205)
    【程序基础】==和=号的区别
    gooogleman嵌入式开发板联盟准备配发嵌入式视频教程
    【终极版】gooogleman嵌入式开发板联盟图标发布以及使用说明
    关于wince驱动和应用学习的N个问题
    【原创】深刻体会wince 驱动中Sleep函数的作用
    网站策划的经典语录
    repeater中用单选按钮
    一个专业制作网站者的自白
    (原创)文件压缩代码
  • 原文地址:https://www.cnblogs.com/HITSZ/p/7793039.html
Copyright © 2011-2022 走看看