`
to_zoe_yang
  • 浏览: 142376 次
  • 性别: Icon_minigender_2
  • 来自: 01
社区版块
存档分类
最新评论

把二元查找树转变成排序的双向链表

 
阅读更多

题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
   
  10
  / \
 6 14
 / \ / \
4 8 12 16
   
 转换成双向链表
4=6=8=10=12=14=16。

 

中序遍历,遍历的过程生成双向链表。

 

先实现双线链表,然后实现二叉查找树。

 

class Node {
	private int value;
	private Node pre = null;
	private Node next = null;
	private Node prior = null;

	public Node(int value) {
		this.value = value;
		prior = this;
	}

	public void insert(int value) {
		Node node = new Node(value);
		prior.next = node;
		node.pre = prior;
		prior = node;
	}

	public void print() {
		Node node = this;
		Node n = null;
		while (node != null) {
			n = node;
			System.out.print(node.value + " ");
			node = node.next;
		}
		System.out.println("-----");
		while (n != null) {
			System.out.print(n.value + " ");
			n = n.pre;
		}
	}
}

public class BiSearchTree {

	private BiSearchTree LeftTree = null;
	private BiSearchTree RightTree = null;
	private int data;

	public BiSearchTree(int data) {
		this.data = data;
	}

	public void insert(int element) {
		BiSearchTree tree = this;
		BiSearchTree insert_node = new BiSearchTree(element);
		BiSearchTree pre = null;
		boolean left = true;
		while (tree != null) {
			pre = tree;
			if (tree.data > element) {
				left = true;
				tree = tree.LeftTree;
			} else {
				left = false;
				tree = tree.RightTree;
			}
		}
		if (left) {
			pre.LeftTree = insert_node;
		} else {
			pre.RightTree = insert_node;
		}
	}

	public void exchange2Link() {
		BiSearchTree node = this;
		BiSearchTree parent = null;
		Stack stack = new Stack();
		Node twoDirLinkList = new Node(Integer.MAX_VALUE);
		do {
			while (node != null) {
				stack.push(node);
				node = node.LeftTree;
			}
			BiSearchTree opNode = (BiSearchTree) stack.pop();
			twoDirLinkList.insert(opNode.data);
			System.out.print(opNode.data + " ");
			node = opNode.RightTree;
		} while (!stack.IsEmpty() || node != null);
		twoDirLinkList.print();
	}

	public static void main(String[] args) {
		// int[] data = {5,2,3,7,4,1,8,6};
		// int[] data = {10,5,12,4,7,2,14,12,9};
		int[] data = { 10, 5, 12, 4, 7 };
		BiSearchTree tree = new BiSearchTree(data[0]);
		for (int i = 1; i < data.length; i++) {
			tree.insert(data[i]);
		}
	}
}

 

 

分享到:
评论

相关推荐

    把二元查找树转变成排序的双向链表 源码

    微软面试题第一题 直接就可以运行 不过二元查找树 不知道怎么自动生成 所以硬生生地一个个敲出来的 为了学习二元树的就不用下了

    微软面试题——二元查找树转变成排序的双向链表

    二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4...

    二元查找树转变为双向链表C语言实现

    将二元查找树转化为排序的双向链表,实质是利用二元查找树的特性,即所有节点按键值有序排列。这个过程的关键在于保持原有的顺序,同时调整节点间的指针,使得它们形成一个双向链表。下面介绍具体的实现步骤: 1. *...

    程序员面试题精选100题.docx

    本文档概述了程序员面试题精选100题,涵盖了C++面试题和笔试题,其中有一道典型的题目是将二元查找树转换成排序的双向链表。 知识点一:二元查找树(Binary Search Tree) * 二元查找树是一种特殊的树数据结构,它...

    面试题36. 二叉搜索树与双向链表

    本题要求将一个二叉搜索树转换为一个排序的循环双向链表。在这个过程中,不能创建新的节点,只能调整树中已有的节点指针。 在双向链表中,每个节点都有两个指针,一个指向它的前驱节点(即顺序上位于其左侧的节点)...

    微软面试题(搜索树转双向链表)

    微软面试题,输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。适合新手入门结构清晰易懂

    C++将二叉树转为双向链表及判断两个链表是否相交

    把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 4=6=8=10=12=14=16 struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // ...

    微软面试100题

    本文将详细介绍其中的一道典型题目:“把二元查找树转变成排序的双向链表”。 #### 题目解析 **题目描述**: 给定一棵二元查找树(Binary Search Tree, BST),将其转换成一个排序的双向链表(Doubly Linked List...

    程序员面试题精选100题

    程序员面试题精选 100 题(01)-把二元查找树转变成排序的 双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向。 程序员面试题精选 100 题...

    程序员面试选精选.doc

    本题“把二元查找树转变成排序的双向链表”是一道典型的数据结构转换问题,主要涉及到二元查找树(Binary Search Tree, BST)和双向链表(Double Linked List)的特性。 1. **二元查找树**: - 二元查找树是一种...

    数据结构 微软面试

    根据给定的信息,本文将详细解释“数据结构微软面试”这一主题中的重要知识点,特别是针对“把二元查找树转变成排序的双向链表”这一具体题目进行深入探讨。 ### 数据结构与算法的重要性 在软件开发领域,数据结构...

    程序员面试题精选100题 随着高校的持续扩张,每年应届毕业生的数目都在不断增长,伴随而来的是应届毕业生的就业压力也越来越大

    总的来说,掌握如何将二元查找树转化为排序双向链表的技巧,对于程序员面试至关重要,因为它展示了对数据结构的理解和实际操作能力。同时,熟悉递归思维和二元查找树的性质是解决问题的关键。通过练习此类问题,求职...

    Google微软-华为腾讯-面试笔试数据结构和算法编程题目和部分答案

    1. 把二元查找树转变成排序的双向链表 这道题目要求将一棵二元查找树转换成一个排序的双向链表,不能创建任何新的节点,只调整指针的指向。解决这个问题需要使用递归算法,先将左子树和右子树分别转换成双向链表,...

    微软等数据结构%2B算法面试100题全部答案集锦

    把二元查找树转变成排序的双向链表 #### 题目解析: 题目要求将一棵二元查找树(Binary Search Tree,BST)转换为一个排序的双向链表(Doubly Linked List)。在这个过程中,不能创建任何新的节点,只能通过调整...

    ms100(微软面试100题)答案整理版 绝对清晰

    通过对“ms100(微软面试100题)”中的“把二元查找树转变成排序的双向链表”题目的深入解析,我们不仅学习了算法设计的基本思想,还了解了C++中数据结构的定义和操作。此类题目不仅考验应聘者的理论基础,更注重实践...

    算法面试题总结_嵌入式-常用知识&面试题库_大厂面试真题.doc

    1. 把二元查找树转变成排序的双向链表:本题目考察了数据结构和算法的知识,要求将二元查找树转换成排序的双向链表。解决方法是首先中序遍历二元查找树,然后调整指针的指向。 2. 设计包含 min 函数的栈:本题目...

Global site tag (gtag.js) - Google Analytics