ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指Offer 36 - 二叉搜索树与双向链表

2020-06-27 11:54:51  阅读:218  来源: 互联网

标签:pre head 遍历 cur Offer 36 链表 right 节点


力扣链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/

题目描述

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

 思路

二叉搜索树的中序遍历结果即是排序的序列,因此我们只需要在中序遍历的过程中处理每一个被遍历到的节点的left&right指向,并找到最终要返回的head节点。

pre:当前遍历到的节点的上一个节点

cur:当前遍历到的节点

  1. 初始化head = null, pre = head,两者都为全局变量。
  2. 中序遍历二叉树,对每个节点cur:
    1. 若pre为空,说明是第一个被遍历到的节点,也就是值最小的节点,保存为head;
    2. 若pre不为空,将pre和cur连接。
    3. pre = cur
  3. 中序遍历结束时,pre指向最右节点,将其于头节点head连接。

代码:

/**
 * // Definition for a Node.
 * function Node(val,left,right) {
 *    this.val = val;
 *    this.left = left;
 *    this.right = right;
 * };
 */
/**
 * @param {Node} root
 * @return {Node}
 */
var treeToDoublyList = function(root) {
    if(!root) return null;
    
    //中序遍历,记录上一个节点pre,每遍历一个节点调整一次链表
    let head = null;
    let pre = head;
    inorder(root);
    
    //中序遍历后pre指向最右边的节点,将其与头节点接上
    pre.right = head;
    head.left = pre;
    
    return head;
    
    function inorder(cur){
        if(!cur)  return;

        inorder(cur.left);

        //处理当前节点
        if(!pre){
            head = cur;
        }else{
            pre.right = cur;
        }
        cur.left = pre;
        pre = cur;

        inorder(cur.right);
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

 

易错:

pre一定要设为全局变量,不能作为参数随中序遍历传递。如果将pre放在inorder函数中(eg. inorder(cur, pre)),pre = cur 只是将形参pre指向了新的地址,并没有改变外部pre的值。  

 

标签:pre,head,遍历,cur,Offer,36,链表,right,节点
来源: https://www.cnblogs.com/xintangchn/p/13197264.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有