我是靠谱客的博主 友好鞋垫,最近开发中收集的这篇文章主要介绍Java详解剑指offer面试题36--二叉搜索树与双向链表Java详解剑指offer面试题36–二叉搜索树与双向链表,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java详解剑指offer面试题36–二叉搜索树与双向链表

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

看到这道题我第一反映就是,二叉树的线索化,不过还是有些区别的,下面会讨论。按照二叉搜索树的特点,最左边的结点是值最小的,而题目要求得到排序的双向链表,所以基本确定下来中序遍历的方法。

二叉树的线索化:是针对每个叶则结点,为了将空指针利用起来,可以将叶子结点的左子结点指向其遍历顺序的前驱,右子结点指向遍历序列的后继。根据遍历顺序的不同,线索化也分为前序、中序、后序。二叉树的结点定义中需要加入布尔变量,用来标示每个结点的左右指针是否被线索化了(这些标志只可能在叶子结点为true)

public static class Node<T> {
    private T data;
    private Node<T> lchild;
    private Node<T> rchild;
    private boolean isleftThread;
    private boolean isRightThread;

  	public Node(T data) {
    	this.data = data;
    	isleftThread = false;
    	isRightThread = false;
  	}
}

// 当前访问结点的前一个结点
private Node<Item> preNode;

public void inOrderThread(Node<Item> node) {
  	if (node == null) {
    	return;
  	}
  	inOrderThread(node.lchild);

  	if (node.lchild == null) {
    	node.lchild = preNode;
    	node.isleftThread = true;
  	}

  	if (preNode != null && preNode.rchild == null) {
    	preNode.rchild = node;
    	preNode.isRightThread = true;
  	}
  	// preNode始终表示上一个访问的结点
  	preNode = node;
  	inOrderThread(node.rchild);
}

public void inOrderThread() {
  inOrderThread(root);
}

而本题要实现双向链表,不光是叶子结点,所有结点的左右指针都要重新设置。因此将上面的限制条件(左右子结点为空才线索化)去掉,就得到本题的答案!

package Chap4;

public class BSTTransToDLinkedList {
    // 当前结点的前驱
    private TreeNode preNode;

    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
            return null;
        }

        TreeNode root = pRootOfTree;
        // 得到双向链表
        inOrder(root);
        // 向左找到双向链表的头结点
        while (root.left != null) {
            root = root.left;
        }
        return root;

    }

    // 中序遍历并改变指针
    private void inOrder(TreeNode node) {
        if (node == null) return;

        inOrder(node.left);

        node.left = preNode;
        if (preNode != null) {
            preNode.right = node;
        }
        preNode = node;

        inOrder(node.right);
    }
}

最后因为需要返回双向链表的头结点,只需从二叉树的根结点开始,向左遍历,即可找到双向链表的头结点。


本文参考文献:
[1]github.com/haiyusun/data-structures

最后

以上就是友好鞋垫为你收集整理的Java详解剑指offer面试题36--二叉搜索树与双向链表Java详解剑指offer面试题36–二叉搜索树与双向链表的全部内容,希望文章能够帮你解决Java详解剑指offer面试题36--二叉搜索树与双向链表Java详解剑指offer面试题36–二叉搜索树与双向链表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部