合并两个二叉排序树(二叉查找树)到一个数组中

package Training;

import java.util.Stack;

import Training.BinaryTree.TreeNode;
/**
 * Content:合并两个二叉排序树(二叉查找树)到一个数组中
 * @author tangzhenyu
 * Specialty:不修改原始的那两个二叉排序树,以中序遍历顺序遍历两颗二叉排序树,排序运用的是归并排序的思想。
 * 耗费的空间为最后保存树中元素的内存空间,中间只需要额外开辟两个栈空间,
 * 栈的深度分别为树的深度。
 * 时间复杂度O(n);
 * 空间复杂度O(n);
 */
public class CombineTwoBST_Clear {
	static Stack<TreeNode<Integer>> s1 = new Stack<TreeNode<Integer>>();
	static Stack<TreeNode<Integer>> s2 = new Stack<TreeNode<Integer>>();
	static TreeNode<Integer> p1 = new TreeNode<Integer>();
	static TreeNode<Integer> q1 = new TreeNode<Integer>();
	static TreeNode<Integer> p2 = new TreeNode<Integer>();
	static TreeNode<Integer> q2 = new TreeNode<Integer>();
	static int i = 0;
	static void nextNode1(TreeNode<Integer> node){
		while(node != null){
			s1.push(node);
			node = node.left;
		}
		if(!s1.isEmpty()){
			p1 = s1.pop();
			q1 = p1;
			p1 = p1.right;					
		}
		
	}
	static void nextNode2(TreeNode<Integer> node){
		while(node != null){
			s2.push(node);
			node = node.left;
		}
		if(!s2.isEmpty()){
			p2 = s2.pop();
			q2 = p2;
			p2 = p2.right;					
		}					
	}
	static void combine(int[] a){
		if(p1 != null && p2 != null){
			nextNode1(p1);
			nextNode2(p2);
			while((!s1.isEmpty() || p1 != null) &&(!s2.isEmpty() || p2 != null)){				
				if(q1.element < q2.element){
					a[i++] = q1.element;
					nextNode1(p1);
				}else{
					a[i++] = q2.element;
					nextNode2(p2);
				}				
			}
			if(p1 == null){			
					if(q1.element < q2.element){
						a[i++] = q1.element;
						while(!s2.isEmpty() || p2 != null){
							a[i++] = q2.element;
							nextNode2(p2);
						}
						a[i]=q2.element;
					}else{			
						while(!s2.isEmpty() || p2 != null){
							a[i++] = q2.element;
							nextNode2(p2);
							if(q1.element < q2.element) {
								a[i++] = q1.element;
								break;
								
							}
						}
						while(!s2.isEmpty() || p2 != null){
							a[i++] = q2.element;
							nextNode2(p2);
						}		
						a[i]=q2.element;
					}
					return;
			}
			if(p2 == null){
				if(q2.element < q1.element){
					a[i++] = q2.element;
					while(!s1.isEmpty() || p1 != null){
						a[i++] = q1.element;
						nextNode1(p1);
					}
					a[i] = q1.element;
				}else{
					while(!s1.isEmpty() || p1 != null){
						a[i++] = q1.element;
						nextNode1(p1);
						if(q2.element < q1.element){
							a[i++] = q2.element;
							break;
						}
					}
					while(!s1.isEmpty() || p1 != null){
						a[i++] = q1.element;
						nextNode1(p1);
					}
					a[i] = q1.element;
				}
				return;
			}
		}
		
	}
	 
	public static void main(String[] args) {
		BinaryTree<Integer> bst1 = new BinaryTree<Integer>();
		BinaryTree<Integer> bst2 = new BinaryTree<Integer>();
		bst1.insert(10);
		bst1.insert(5);
		bst1.insert(7);
		bst1.insert(3);
		bst1.insert(12);
		bst1.insert(16);
		bst1.insert(24);
		bst2.insert(20);
		bst2.insert(15);
		bst2.insert(1);
		bst2.insert(17);
		bst2.insert(23);
		bst2.insert(25);
		bst2.insert(27);
		int[] arr = new int[bst1.size+bst2.size];
		p1=bst1.root;
		p2=bst2.root;
		combine(arr);
		System.out.println("Size1:"+bst1.size+"\tSize2:"+bst2.size);
		for(int i = 0 ; i < arr.length ; ++i){
			System.out.print(arr[i] +"\t");
		}
	}

}

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/tangzhenyu1990/article/details/24470959
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞