`
shuofenglxy
  • 浏览: 195317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

分析:二叉树中序遍历即可得到一个有序的结果,只要按照中序遍历的顺序把二叉树节点依次放入双向链表中即可。这里以原有二叉树节点的左序节点表示前驱,右子节点表示后继。

 

具体源码如下:

二叉树节点类:

package convertBSTreeToDList;

public class BSTreeNode {

	int data;
	BSTreeNode left;
	BSTreeNode right;
	public BSTreeNode(int data){
		this.data =data;
		this.right=null;
		this.left=null;
	}
}

 

二叉树:

package convertBSTreeToDList;



public class BSTree {
	private BSTreeNode root;
	
	public BSTree(BSTreeNode node){
		this.setRoot(node);
	}
	
	public void setRoot(BSTreeNode root) {
		this.root = root;
	}
	public BSTreeNode getRoot() {
		return root;
	}
	
	/**
	 * 忽略已经存在该值的节点
	 */
	public  void insert(BSTreeNode root,BSTreeNode node){
		if(root == null)
			root = node;
		if(root.data>node.data){
			if(root.left!=null)
				insert(node,root.left);
			root.left = node;
		}
		
		if(root.data<node.data){
			if(root.right!=null)
				insert(node,root.right);
			root.right = node;
		}
	}
	
	public void displayInOrder(BSTreeNode root){
		if(root == null)
			return;
		if(root.left!=null)
			displayInOrder(root.left);
		
		System.out.print(root.data+" ");
		
		if(root.right!=null)
			displayInOrder(root.right);
	}
}

 

双向链表类:

package convertBSTreeToDList;

public class DList {

	/**
	 * 双向链表头结点
	 */
	private BSTreeNode head;
	/**
	 * 双向链表当前结点 也就是双向链表的尾节点
	 */
	private BSTreeNode current;
	
	public DList(BSTreeNode head){
		this.setHead(head);
	}
	
	/**
	 * 插入一个新二叉树节点到双向链表,并返回双向链表的当前节点
	 */
	public BSTreeNode insertDListNode(BSTreeNode node){
		
		if(current == null){
			head = node;
			current = node;
			return current;
			}
		
		current.right = node;
		node.left = current;
		current = current.right;
		return current;
	}
	
	public void setHead(BSTreeNode head) {
		this.head = head;
	}
	public BSTreeNode getHead() {
		return head;
	}
	public void setCurrent(BSTreeNode current) {
		this.current = current;
	}
	public BSTreeNode getCurrent() {
		return current;
	}

}

 

转换工具类:

package convertBSTreeToDList;

public class BSTree2DListConvertutil {
	
	/**
	 * 二叉树到双向链表的转化
	 * 将二叉树的中序遍历结果放入一个双向链表中即可
	 * @param root
	 * @param dlist
	 */
	public static void convert(BSTreeNode root,DList dlist){

		if(root ==null)
			return;
		
		if(root.left!=null)
			convert(root.left,dlist);
	
		dlist.insertDListNode(root);
		
		if(root.right!=null)
			convert(root.right,dlist);
		
	}
	/**
	 * 双向链表的正向打印
	 * @param dlist
	 */
	public static void displayAfterConvert(DList dlist){
		BSTreeNode head = dlist.getHead();
		if(head !=null)
			System.out.print(head.data);
		head = head.right;
		while(head!=null){
			System.out.print("-->"+head.data);
			head = head.right;
		}
	}
	/**
	 * 反向打印双向链表,就是从尾打向头,为了便于观看,这里巧用了stringBuffer的reverse方法
	 * @param dlist
	 * @return
	 */
	public static String reverseDisplay(DList dlist){
		BSTreeNode current  = dlist.getCurrent();
		StringBuilder sb = new StringBuilder();
		
		while(current!=null){
			sb.append(current.data);
			if(current.left!=null)
				sb.append("--<");
			current = current.left;
		}
		sb.reverse();
		return sb.toString();
	}

}
 

测试类:

package convertBSTreeToDList;

public class BSTree2DListConvertTest {

	public static void main(String[]args){
		BSTreeNode head = null;
		DList dlist = new DList(head);
		int [] demo = {5,9,2,7,11,1,4};
		BSTreeNode node = new BSTreeNode(demo[0]);
		BSTree t = new BSTree(node);
		for(int i=1;i<demo.length;i++){
			node = new BSTreeNode(demo[i]);
			t.insert(t.getRoot(), node);
		}
		System.out.println("二叉树遍历如下:");
		t.displayInOrder(t.getRoot());
		System.out.println();
		System.out.println("-------------");
		
		BSTree2DListConvertutil.convert(t.getRoot(),dlist);
		System.out.println("双向链表正向遍历如下:");
		BSTree2DListConvertutil.displayAfterConvert(dlist);
		System.out.println();
		System.out.println("双向链表反向遍历如下:");
		String result = BSTree2DListConvertutil.reverseDisplay(dlist);
		System.out.println(result);
	}
}

 

测试结果如下:

二叉树遍历如下:
1 2 4 5 7 9 11
-------------
双向链表正向遍历如下:
1-->2-->4-->5-->7-->9-->11
双向链表反向遍历如下:
1<--2<--4<--5<--7<--9<--11

 

总结:要点在于对二叉查找树的性质要熟悉。

 

 

0
0
分享到:
评论

相关推荐

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

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

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

    二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 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题.doc

    #### (01) 把二元查找树转变成排序的双向链表 **题目描述** 给定一棵二元查找树(Binary Search Tree,简称BST),目标是将其转换为一个排序的双向链表。要求在转换过程中不创建新的节点,仅调整节点之间的指针...

    微软面试100题

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

    程序员面试题精选100题

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

    程序员面试选精选.doc

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

    数据结构 微软面试

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

    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