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),空间复杂度是树的高度;
  • 相关阅读:
    转 Unicdoe【真正的完整码表】对照表
    golang中,unsafe.sizeof到底是干嘛的?
    转载 Golang []byte与string转换的一个误区
    python异常处理--try except else raise finally
    微信静默授权增加浏览器历史记录导致跳转死循环的解决方案
    package-lock.json,我们应该了解
    webpack实现静态资源缓存的那点事
    webpack+babel项目在IE下报Promise未定义错误引出的思考
    CORS预检请求详谈
    谈谈form-data请求格式
  • 原文地址:https://www.cnblogs.com/HITSZ/p/7793039.html
Copyright © 2011-2022 走看看