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

简介: 剑指offer_二叉树---二叉搜索树与双向链表

##题目描述

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

##解题思路

1,有序且为二叉搜索树,则只要使用二叉搜索树的中序遍历即可

2,二叉搜索树的左子树链表最右端链接根,根链接右子树链表最左端

3,递归链接即可

##代码

/**
 * 
 */
package 二叉树;
/**
 * <p>
 * Title:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
 * </p>
 * 解题思路: 1.将左子树构造成双链表,并返回链表头节点。 2.定位至左子树双链表最后一个节点。
 * 3.如果左子树链表不为空的话,将当前root追加到左子树链表。 4.将右子树构造成双链表,并返回链表头节点。
 * 5.如果右子树链表不为空的话,将该链表追加到root节点之后。 6.根据左子树链表是否为空确定返回的节点。
 * <p>由于要求转换后是排好序的,所以采用中序遍历。
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月8日 下午10:36:03
 */
public class Convert {
  public TreeNode NodeConvert(TreeNode root) {
    if (root == null)
      return null;
    if (root.left == null && root.right == null)
      return root;
    //中序遍历哦==========================================================
    // 1.将左子树构造成双链表,并返回链表头节点
    TreeNode left = NodeConvert(root.left);  
    TreeNode p = left;
    // 2.定位至左子树双链表最后一个节点
    while (p != null && p.right != null) {
      p = p.right;
    }
    // 3.如果左子树链表不为空的话,将当前root追加到左子树链表
    if (left != null) {
      p.right = root;
      root.left = p;
    }
    //中序遍历哦==========================================================
    // 4.将右子树构造成双链表,并返回链表头节点
    TreeNode right = NodeConvert(root.right);
    // 5.如果右子树链表不为空的话,将该链表追加到root节点之后
    if (right != null) {
      right.left = root;
      root.right = right;
    }
    return left != null ? left : root;
  }
}


相关文章
|
16天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
58 0
|
5月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
33 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
61 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
49 4
|
7月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
97 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
8月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
8月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
8月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点