LeetCode426之 将二叉搜索树转化为排序的双向链表(相关话题:双向链表,二叉树中序)

题目描述:

将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

为了让您更好地理解问题,以下面的二叉搜索树为例:

在这里插入图片描述

 

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

LeetCode426之 将二叉搜索树转化为排序的双向链表(相关话题:双向链表,二叉树中序)_第1张图片

解题思路

LeetCode426之 将二叉搜索树转化为排序的双向链表(相关话题:双向链表,二叉树中序)_第2张图片

构造双向链表时需要定义两个变量cur和pre,他们的关系如下图所示: 

LeetCode426之 将二叉搜索树转化为排序的双向链表(相关话题:双向链表,二叉树中序)_第3张图片

 还需要定义一个变量last来记录最后一个节点和第一个节点(head)的前后关系

参考代码 

package com.lzhsite.leetcode.algoritom.practise.linked;

import java.util.LinkedList;
import java.util.Queue;

import com.lzhsite.leetcode.algoritom.dataStruct.DLNode;
import com.lzhsite.leetcode.algoritom.dataStruct.tree.BinTreeNode;

public class 将二叉搜索树转为双向链表 {

	private BinTreeNode convert(BinTreeNode head) {

		Queue queue = new LinkedList();
		middleOrder(head, queue);

		//记录最后一个节点
		BinTreeNode last = null;

		// cur初始值为null
		BinTreeNode cur = null;

		// pre节点初始值为head即队列的头结点
		head = queue.poll();
		BinTreeNode pre = head;

       
        //设置双向链表的前后关系,这是核心逻辑
		while (!queue.isEmpty()) {

			cur = queue.poll();
			pre.setRChild(cur);
			cur.setLChild(pre);
			pre = cur;

		}

        //把头结点和尾结点连接起来
		last = pre;
        last.setRChild(head);
        head.setLChild(last);

		return head;
	}

	private void middleOrder(BinTreeNode treeNode, Queue queue) {
		// TODO Auto-generated method stub

		if (treeNode == null) {
			return;
		}

		middleOrder(treeNode.getLChild(), queue);
		queue.add(treeNode);
		middleOrder(treeNode.getRChild(), queue);
	}

}

 

你可能感兴趣的:(算法)