`

java-1.二叉查找树转为双向链表

 
阅读更多
import java.util.ArrayList;
import java.util.List;


public class BSTreeToLinkedList {
	
	/*
把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=1
	 */
	public static void main(String[] args) {
		BSTreeToLinkedList bn=new BSTreeToLinkedList();
		int[] a={10,6,14,4,8,12,16};//这些数据是按二叉查找树的层次遍历存放
		Node head=bn.creatTree(a);
		bn.toTwoWayLinkedList(head);
		bn.printTwoLinkedList(head);
		
	}

	/*
	 * 思路:中序遍历二叉树,将上次访问的节点记为previous,当前访问的节点记为current;

           对于遍历过程中的每个当前节点,让该节点的左指针指向previous(current->left = previous),让previous的右指针

           指向当前节点(previous->right = current),然后将previous更新为current。当中序遍历结束时,二叉搜索树也

           被转化为双链表了。
           
          具体思路可参见:http://hi.baidu.com/gropefor/blog/item/d2144f8ce0325105b31bba11.html
           
         问题:这个previous只能作为类成员才能得到正确的结果,作为局部变量的话,我得不到正解。
              我尝试过这样写: toTwoWayLinkedList(Node node,Node previous),在main函数里面调用时候,用
			toTwoWayLinkedList(head,null),得不到正确答案
	 */
	private Node previous;
	public void toTwoWayLinkedList(Node node){
		if(node!=null){
			toTwoWayLinkedList(node.getLeft());
			if(previous!=null){
				previous.setRight(node);
				node.setLeft(previous);
			}
			previous=node;
			toTwoWayLinkedList(node.getRight());
		}
	}
	public void printTwoLinkedList(Node node){
		if(node!=null){
			//after converting to List,head=a[0]=10,but the head is not the actually head of list.
			//the true head is 4.
			while(node.getLeft()!=null){
				node=node.getLeft();//find the true Head.
			}
			while(node!=null){
				System.out.print(node.getData()+" ");
				node=node.getRight();
			}
		}
	}
	public Node creatTree(int[] data){
		List<Node> nodeList=new ArrayList<Node>();
		for(int each:data){
			Node node=new Node(each);
			nodeList.add(node);
		}
		int lastRootIndex=data.length/2-1;
		for(int i=lastRootIndex;i>=0;i--){
			int leftIndex=i*2+1;
			Node root=nodeList.get(i);
			Node left=nodeList.get(leftIndex);
			root.setLeft(left);
			if(leftIndex+1<data.length){
				Node right=nodeList.get(leftIndex+1);
				root.setRight(right);
			}
		}
		Node head=nodeList.get(0);
		return head;
		
	}
	
	
}

class Node{
	private int data;
	private Node left;
	private Node right;
	
	public Node(int i){
		data=i;
	}
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	public Node getLeft() {
		return left;
	}
	public void setLeft(Node left) {
		this.left = left;
	}
	public Node getRight() {
		return right;
	}
	public void setRight(Node right) {
		this.right = right;
	}
}

0
0
分享到:
评论

相关推荐

    TQCAI#Algorithm#剑指 Offer 36. 二叉搜索树与双向链表1

    剑指 Offer 36. 二叉搜索树与双向链表题解写的比我的简单面试题36. 二叉搜索树与双向链表(中序遍历,清晰图解)

    二叉搜索树 转为 双向链表,

    而将一个二叉搜索树转换为双向链表,可以进一步优化某些操作,如顺序遍历,因为链表提供了连续的访问方式。 双向链表(Doubly Linked List)是一种线性数据结构,其中每个节点包含数据和两个指针,分别指向其前一个...

    二叉查找树转双向链表

    这个是某公司的一道题,是把二叉查找树 转为双向链表的,我用程序实现了。希望对你有帮助!

    wujie199#CS#36. 二叉搜索树与双向链表1

    36. 二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。解题思路private TreeNode pre = null;

    MangoDowner#clear-leetcode#剑指Offer36.二叉搜索树与双向链表1

    实现思路如下图所示:* 1)假设当前遍历的结点为root,root的左子树已经被转换为双向链表(如下图(1)所示)* 2)使用两个变量pHead与pEnd分别指

    《剑指Offer》刷题笔记——面试题36. 二叉搜索树与双向链表

    《剑指Offer》中的面试题36探讨了一个有趣的问题,即如何将一棵二叉搜索树转化为一个双向链表。这道题目主要考察了对二叉搜索树(BST)特性的理解以及链表操作的能力。 首先,我们要明确二叉搜索树的基本特性:对于...

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

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

    java基础面试题二叉搜索树与双向链表

    java基础面试题二叉搜索树与双向链表本资源系百度网盘分享地址

    java--实现二叉排序树

    二叉排序树的优势在于它的搜索、插入和删除操作的时间复杂度在最佳情况下为O(log n),但最坏情况下可能退化成链表,时间复杂度变为O(n)。为了优化这种情况,可以使用自平衡二叉搜索树,如AVL树和红黑树,它们在任何...

    面试题27_二叉搜索树与双向链表

    而将一个二叉搜索树转换成一个排序的双向链表,则可以利用其天然的有序性,优化某些特定算法的实现,如在链表中进行连续操作。 题目“剑指offer”中的面试题27,就是关于这个转换过程。这个过程的核心在于如何通过...

    二叉排序树变成双向循环链表

    二叉排序树变成双向循环链表,二叉排序树变成双向循环链表,二叉排序树变成双向循环链表

    二叉搜索树与双向链表.md

    二叉搜索树与双向链表.md

    二叉搜索树与双向链表01

    在给定的题目中,我们需要将一个二叉搜索树转换为一个双向链表,同时保持原有的顺序关系。这个操作通常称为“中序遍历”转换,因为二叉搜索树的中序遍历序列是一个有序序列,这正是双向链表的特点。中序遍历的顺序是...

    三元组、循环链表以及二叉查找树.zip_三元_三元组_二叉查找树_循环链表

    本压缩包中的内容涉及了三个核心的数据结构概念:三元组、循环链表和二叉查找树,它们在编程和算法设计中都有着重要的应用。 首先,我们来看三元组(Triple)。三元组是一种用于表示三个元素的集合,常用于数据库...

    c++-剑指offer题解之二叉搜索树与双向链表

    c++ c++_剑指offer题解之二叉搜索树与双向链表

    Python二叉搜索树与双向链表转换算法示例

    本文实例讲述了Python二叉搜索树与双向链表转换算法。分享给大家供大家参考,具体如下: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的...

    python-剑指offer第26题二叉搜索树与双向链表

    python python_剑指offer第26题二叉搜索树与双向链表

    二叉搜索树与双向链表1

    在本题中,我们面临的任务是将一棵二叉搜索树转换为一个排序的循环双向链表。 双向链表(Doubly Linked List)是一种数据结构,其中每个节点包含两个指针,一个指向前一个节点(前驱),另一个指向后一个节点(后继...

    树的实现--利用二叉链表(孩子-兄弟)存储结构

    在C语言中,实现树的存储结构有多种方法,其中一种常见的方式是使用二叉链表,即“孩子-兄弟”存储结构。这种结构允许我们高效地表示和操作树中的节点,特别适用于那些节点具有多个子节点的情况。 “孩子-兄弟”...

Global site tag (gtag.js) - Google Analytics