程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]

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

例如输入:

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

输出:

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

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

struct BSTreeNode // a node in the binary search tree (BST)
{
      int          m_nValue; // value of node
      BSTreeNode  *m_pLeft;  // left child of node
      BSTreeNode  *m_pRight; // right child of node
};


分析:尽管我们可能一下子不能理解镜像是什么意思,但上面的例子给我们的直观感觉,就是交换结点的左右子树。我们试着在遍历例子中的二元查找树的同时来交换每个结点的左右子树。遍历时首先访问头结点8,我们交换它的左右子树得到:

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

我们发现两个结点610的左右子树仍然是左结点的值小于右结点的值,我们再试着交换他们的左右子树,得到:

      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);
      }
}
转自:http://zhedahht.blog.163.com/blog/static/2541117420072159363370/

程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]

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

程序员面试题精选100题(11)-求二元查找树的镜像

http://zhedahht.blog.163.com/blog/static/2541117420072159363370/ 题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月28日 15:17
  • 273

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构

转自:http://zhedahht.blog.163.com/blog/static/254111742007127104759245/ 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双...

程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:  ...

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。   比如将二元查找树                                ...

程序员面试题精选100题(12)-从上往下遍历二元树[数据结构]

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入       8     /  \    6    10   /\     /\  5...

程序员面试题精选100题(12)-从上往下遍历二元树[数据结构]

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入       8     /  \    6    10   /\     /\  5  7 ...

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表

转载地址:http://zhedahht.blog.163.com/blog/static/254111742007127104759245/ 题目:输入一棵二元查找树,将该二元查找树转换成...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月28日 10:39
  • 369

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 参见博客: http://zhedahht.blog.163.com/blog/static/25411174200...

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表—python实现

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。  比如将二元查找树                                   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]
举报原因:
原因补充:

(最多只允许输入30个字)