国外大学网站建设比较,建行个人账户查询,龙华做网站yihe kj,wordpress chat题目
输入一棵二叉搜索树#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题#xff0c;以下面的二叉搜索树为例#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表…题目
输入一棵二叉搜索树将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点只能调整树中节点指针的指向。 为了让您更好地理解问题以下面的二叉搜索树为例 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表第一个节点的前驱是最后一个节点最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。 特别地我们希望可以就地完成转换操作。当转化完成以后树中节点的左指针需要指向前驱树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
解题思路 1.题目要求将二叉搜索树转换成一个排序的循环双向链表既然他需要排序那么我们就对二叉搜索树进行中序遍历这样我们就可以得到有顺序的序列。 2.我们新建一个队列 queue 然后对二叉搜索树进行中序遍历并且将遍历的结果入队。 3.遍历结束后我们就得到了一个有序队列这时我们只需要使用 whie 循环让队列中的元素出队并且将元素做一下连接让前一个元素的right指针指向后一个元素让后一个元素的left指针指向前一个元素。最后不要忘记首位元素的连接。 代码实现
class Solution {public Node treeToDoublyList(Node root) {if(root null){return null;}QueueNode queue new LinkedList();inOrder(root, queue);Node head queue.poll();Node pre head;while(!queue.isEmpty()){Node cur queue.poll();pre.right cur;cur.left pre;pre cur;}pre.right head;head.left pre;return head;}void inOrder(Node root, QueueNode queue){if(root null){return;}inOrder(root.left, queue);queue.add(root);inOrder(root.right, queue);}
}
测试结果