有序输出两棵二叉查找树中的元素

题目:给出两棵二叉查找树,有序输出所有元素,时间复杂度O(n),空间复杂度O(h),h为树的高度

此题就是把两棵二叉查找树的中序遍历过程结合在一起。

  1. struct TreeNode   
  2. {  
  3.     int val;  
  4.     TreeNode *left;  
  5.     TreeNode *right;  
  6.     TreeNode(int x) : val(x), left(NULL), right(NULL) {}  
  7. };  
  8.   
  9. void print2BSTsInSortedOrder(TreeNode *root1, TreeNode *root2)  

10. {  

  1. 11.     stack<TreeNode *> stk1, stk2;  
  2. 12.     TreeNode *p1 = root1;  
  3. 13.     while(p1)  
  4. 14.     {  
  5. 15.         stk1.push(p1);  
  6. 16.         p1 = p1->left;  //最小节点
  7. 17.     }  
  8. 18.     TreeNode *p2 = root2;  
  9. 19.     while(p2 != NULL)  
  10. 20.     {  
  11. 21.         stk2.push(p2);  
  12. 22.         p2 = p2->left;  //最小节点
  13. 23.     }  
  14. 24.     while(!stk1.empty() || !stk2.empty())  
  15. 25.     {  
  16. 26.         if(!stk1.empty())  
  17. 27.             p1 = stk1.top();  
  18. 28.         if(!stk2.empty())  
  19. 29.             p2 = stk2.top();  
  20. 30.         if(p1 == NULL || (p2 && p2->val <= p1->val))  
  21. 31.         {  
  22. 32.             printf("%d ", p2->val);  
  23. 33.             stk2.pop();  
  24. 34.               //获取p2节点的下一个节点,右节点的最左节点,加入栈中,下次从栈中弹出的就是下一个节点
  25. 35.             p2 = p2->right;  
  26. 36.             while(p2 != NULL)  
  27. 37.             {  
  28. 38.                 stk2.push(p2);  
  29. 39.                 p2 = p2->left;  
  30. 40.             }  
  31. 41.         }  
  32. 42.         else if(p2 == NULL || (p1 && p1->val <= p2->val))  
  33. 43.         {  
  34. 44.             printf("%d ", p1->val);  
  35. 45.             stk1.pop();  
  36.                  //获取p1节点的下一个节点,右节点的最左节点,加入栈中,下次从栈中弹出的就是下一个节点
  37. 46.             p1 = p1->right;  
  38. 47.             while(p1)  
  39. 48.             {  
  40. 49.                 stk1.push(p1);  
  41. 50.                 p1 = p1->left;  
  42. 51.             }  
  43. 52.         }  
  44. 53.     }  

54. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值