首页 > 其他 > 详细

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

时间:2020-06-27 12:18:45      阅读:58      评论:0      收藏:0      [点我收藏+]

力扣链接: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的值。  

 

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

原文:https://www.cnblogs.com/xintangchn/p/13197264.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!