题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。

 

定义二元查找树的结点为:

  1. struct BSTreeNode // a node in the binary search tree (BST)  
  2. {  
  3.     int m_nValue; // value of node   
  4.     BSTreeNode *m_pLeft; // left child of node  
  5.     BSTreeNode *m_pRight; // right child of node   
  6. }; 

思路一:在遍历二元查找树时每访问到一个结点,交换它的左右子树。这种思路用递归不难实现。

  1. void Mirror(BSTreeNode *node)  
  2. {  
  3.     BSTreeNode *tmp=node->m_pLeft;  
  4.     node->m_pLeft=node->m_pRight;  
  5.     node->m_pRight=tmp;  
  6.     if(node->m_pLeft!=NULL)  
  7.         Mirror(node->m_pLeft);  
  8.     if(node->m_pRight!=NULL)  
  9.         Mirror(node->m_pRight);  

思路二:由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。如果它有左子树,把它的左子树压入栈中;如果它有右子树,把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。

  1. void Mirror2(BSTreeNode *node)  
  2. {  
  3.     stack<BSTreeNode *> TreeNode;  
  4.     TreeNode.push(node);  
  5.     while(TreeNode.size())  
  6.     {  
  7.         BSTreeNode *pnode=TreeNode.top();  
  8.         TreeNode.pop();  
  9.         BSTreeNode *tmp=pnode->m_pLeft;  
  10.         pnode->m_pLeft=pnode->m_pRight;  
  11.         pnode->m_pRight=tmp;  
  12.         if(pnode->m_pLeft!=NULL)  
  13.             TreeNode.push(pnode->m_pLeft);  
  14.         if(pnode->m_pRight!=NULL)  
  15.             TreeNode.push(pnode->m_pRight);  
  16.     }  
  17. }  
  18.           
  19. void PrintTree(BSTreeNode *node)  
  20. {  
  21.     cout<<node->m_nValue<<"  ";  
  22.     if(node->m_pLeft!=NULL)  
  23.         PrintTree(node->m_pLeft);  
  24.     if(node->m_pRight!=NULL)  
  25.         PrintTree(node->m_pRight);  
  26. }  
  27. void main()  
  28. {  
  29.     BSTreeNode a[7];  
  30.     a[0].m_nValue=8;  
  31.     a[1].m_nValue=6;  
  32.     a[2].m_nValue=10;  
  33.     a[3].m_nValue=5;  
  34.     a[4].m_nValue=7;  
  35.     a[5].m_nValue=9;  
  36.     a[6].m_nValue=11;  
  37.     a[0].m_pLeft=&a[1];  
  38.     a[0].m_pRight=&a[2];  
  39.     a[1].m_pLeft=&a[3];  
  40.     a[1].m_pRight=&a[4];  
  41.     a[2].m_pLeft=&a[5];  
  42.     a[2].m_pRight=&a[6];  
  43.     a[3].m_pLeft=NULL;a[3].m_pRight=NULL;  
  44.     a[4].m_pLeft=NULL;a[4].m_pRight=NULL;  
  45.     a[5].m_pLeft=NULL;a[5].m_pRight=NULL;  
  46.     a[6].m_pLeft=NULL;a[6].m_pRight=NULL;  
  47.      PrintTree(&a[0]);  
  48.      cout<<endl;  
  49.      Mirror2(&a[0]);  
  50.      PrintTree(&a[0]);