读书人

标题:输入一颗二元查找树将该树转换

发布时间: 2012-10-24 14:15:58 作者: rapoo

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

8
/ \
6 10
/\ /\
5 7 9 11

输出:

8
/ \
10 6
/\ /\
11 9 7 5

思路:
左右子树交换

如果用循环来做:就是用辅助栈来模拟递归

// Mirror a BST (swap the left right child of each node) recursively// the head of BST in initial call///////////////////////////////////////////////////////////////////////void MirrorRecursively(BSTreeNode *pNode){      if(!pNode)            return;      // swap the right and left child sub-tree      BSTreeNode *pTemp = pNode->m_pLeft;      pNode->m_pLeft = pNode->m_pRight;      pNode->m_pRight = pTemp;      // mirror left child sub-tree if not null      if(pNode->m_pLeft)            MirrorRecursively(pNode->m_pLeft);        // mirror right child sub-tree if not null      if(pNode->m_pRight)            MirrorRecursively(pNode->m_pRight); }程序基本上一样///////////////////////////////////////////////////////////////////////// Mirror a BST (swap the left right child of each node) Iteratively// Input: pTreeHead: the head of BST///////////////////////////////////////////////////////////////////////void MirrorIteratively(BSTreeNode *pTreeHead){      if(!pTreeHead)            return;      std::stack<BSTreeNode *> stackTreeNode;      stackTreeNode.push(pTreeHead);      while(stackTreeNode.size())      {            BSTreeNode *pNode = stackTreeNode.top();            stackTreeNode.pop();            // swap the right and left child sub-tree            BSTreeNode *pTemp = pNode->m_pLeft;            pNode->m_pLeft = pNode->m_pRight;            pNode->m_pRight = pTemp;            // push left child sub-tree into stack if not null            if(pNode->m_pLeft)                  stackTreeNode.push(pNode->m_pLeft);            // push right child sub-tree into stack if not null            if(pNode->m_pRight)                  stackTreeNode.push(pNode->m_pRight);      }}

读书人网 >编程

热点推荐