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
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/tangzhenyu1990/article/details/24470959
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。