二元查找树转双向链表

public class A01 {
	/**
	 * 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
	 * */
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Tree tree = new Tree();
		Node node = Tree2List(tree.getRootNode(),true);
		System.out.println();
	}
	
	/**
	 * 将该二元查找树转换成一个排序的双向链表
	 * 算法说明:采用递归的调用的方法
	 * 递归的结束条件:
	 * 如果这个树是左子树,并且已经转换完成,返回的是最右的孩子
	 * 如果这个树是右子树,并且已经转化完成,返回的是最左的节点
	 * 如果为叶子节点,直接返回叶子节点
	 * 递归的条件:
	 * 首先排序左子树
	 * 然后排序右子树
	 */
	private static Node Tree2List(Node rootNode, boolean isRight) {
		// TODO Auto-generated method stub
		if(rootNode == null){
			return null;
		}else{
			//要求不能创建任何新的结点
			//左右节点不为空的时候,就递归的调用左右节点
		      Node leftNode = rootNode.getLeft();  
		      Node rightNode = rootNode.getRight();  
		          
		         
		        if (leftNode != null) {  
		        	//如果左节点不为空,那么则去调用左子树
		            Node leftResultNode = Tree2List(leftNode, false);  
		            if (leftResultNode != null) {  
		                rootNode.setLeft(leftResultNode);  
		                leftResultNode.setRight(rootNode);  
		            }  
		        }  
		          
		        if (rightNode != null) { 
		        	//如果右节点不为空,那么则去调用有姿势
		            Node rightResultNode = Tree2List(rightNode, true);  
		            if (rightResultNode != null) {  
		                rightResultNode.setLeft(rootNode);  
		                rootNode.setRight(rightResultNode);  
		            }  
		        }  
		          
		          
		        Node tempNode = rootNode;  
		          
		        if (isRight) { 
		        	//如果是右子树,那么返回的则左节点
		            if (leftNode != null) {  
		                return lastLeftnode(leftNode);  
		            }  
		        } else {  
		        	//如果是左子树,那么返回的则是右节点
		            if (rightNode != null) {  
		                return lastRightNode(rightNode);  
		            }  
		        }  
		          
		        return tempNode; 
			
		}
	}

	/**
	 * @param rightNode
	 * @return
	 */
	private static Node lastRightNode(Node rightNode) {
		while(rightNode.getRight() != null){
			rightNode = rightNode.getRight();
		}
		return rightNode;
	}

	/**
	 * @param leftNode
	 * @return
	 */
	private static Node lastLeftnode(Node leftNode) {
		while(leftNode.getLeft() != null){
			leftNode = leftNode.getLeft();
		}
		return leftNode;
	}

	/**
	 * 代表树中的单个结点
	 * @zhailzh
	 */
	static class Node {
		
		public Node(int str) {
			setContent(str);
		};
		private int content;//节点内容
		
		private Node left;//左节点
		
		private Node right;//右节点

		public int getContent() {
			return content;
		}

		public void setContent(int content) {
			this.content = content;
		}

		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;
		}

		/**
		 * 测试的树
		 * */
		static  class Tree {		
			public final Node rootNode = new Node(10);	
			public Node getRootNode () {
				Node node6 = new Node(6);
				
				Node node3 = new Node(3);
				Node node4 = new Node(4);
				Node node5 = new Node(5);
				
				Node node7 = new Node(7);
				Node node8 = new Node(8);
				Node node9 = new Node(9);
				
				Node node14 = new Node(14);
				Node node12 = new Node(12);
				Node node16 = new Node(16);
				rootNode.setLeft(node6);
				rootNode.setRight(node14);
				node6.setLeft(node4);
				node4.setLeft(node3);
				node4.setRight(node5);
				node6.setRight(node8);
				node8.setLeft(node7);
				node8.setRight(node9);
				node14.setLeft(node12);
				node14.setRight(node16);
				return rootNode;
			}
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值