算法 把二叉查找树转变成排序的双向链表

记住: 树的问题都递归

概念:

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表


二叉排序树又称二叉查找树, 或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。



代码: 注意里面的创建树不是写的代码, 是默认已经创建好

package BinarySearchTreeToDoubleLinkList;

public class BinarySearchTreeToDoubleLinkList {
	
	public static void main(String[] args) {
		TreeNode root = TreeNode.createBinarySearchTree();
		System.out.println("-----middleSearchBinaryTree-----");
		TreeNode.middleSearch(root);
		System.out.println("-----doubleLinkedList-----");
		LinkedListNode.printLinkedListNode(TreeNode.first);
	}
}

class TreeNode {
	int nodeValue;
	TreeNode leftChild;
	TreeNode rightChild;
	static LinkedListNode first = new LinkedListNode();
	
	public static TreeNode createBinarySearchTree(){//int[] treeNodeArray) {
		TreeNode root = new TreeNode();
		//构造树略
		root.nodeValue = 50;
		root.leftChild = new TreeNode();
		root.rightChild = new TreeNode();
		root.leftChild.nodeValue=20;
		root.rightChild.nodeValue=60;
		root.leftChild.leftChild = new TreeNode();
		root.leftChild.rightChild = new TreeNode();
		root.leftChild.leftChild.nodeValue=15;
		root.leftChild.rightChild.nodeValue=30;
		root.rightChild.rightChild = new TreeNode();
		root.rightChild.rightChild.nodeValue = 70;
		return root;
	}
	
	public static void middleSearch(TreeNode root) {
		if(root.leftChild==null) {
			System.out.println(root.nodeValue);
			LinkedListNode.addToLinkedList(first, root.nodeValue);
			if(root.rightChild!=null) {
				middleSearch(root.rightChild);
			}
		}
		else {
			middleSearch(root.leftChild);
			System.out.println(root.nodeValue);
			LinkedListNode.addToLinkedList(first, root.nodeValue);
			if(root.rightChild!=null) {
				middleSearch(root.rightChild);
			}
		}
	}
	
}

class LinkedListNode {
	int nodeValue;
	LinkedListNode prev;
	LinkedListNode next;
	
	public static void printLinkedListNode(LinkedListNode first) {
		LinkedListNode node = first;
		while(node.next!=null) {
			System.out.println(node.next.nodeValue);
			node = node.next;
		}
	}
	
	public static void addToLinkedList(LinkedListNode first, int value){
		LinkedListNode node = first;
		while(node.next!=null) {
			node = node.next;
		}
		LinkedListNode insertNode = new LinkedListNode();
		insertNode.nodeValue = value;
		node.next = insertNode;
		insertNode.prev = node;
		insertNode.next = null;
	}
}

打印结果:

-----middleSearchBinaryTree-----
15
20
30
50
60
70
-----doubleLinkedList-----
15
20
30
50
60
70



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值