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

来源:互联网 发布:南风知我意浅云txt下载 编辑:程序博客网 时间:2024/05/16 04:53

题目:

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

例如输入:
  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
};

  

解题思路:

                利用二叉树后序遍历的性质,对叶子节点进行翻转。

代码如下:

#include <iostream>#include <string.h>using namespace std;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};void BuildTree(BSTreeNode *&Node,int n)   //建立二叉树{if(Node == NULL){BSTreeNode *NewNode = new BSTreeNode();NewNode->m_nValue = n;NewNode->m_pLeft = NULL;NewNode->m_pRight = NULL;Node = NewNode;}else if(Node->m_nValue < n) {BuildTree(Node->m_pRight,n);}else {BuildTree(Node->m_pLeft,n);}}void Convert(BSTreeNode *&Node)  //进行镜像转换{if(Node == NULL)return ;Convert(Node->m_pLeft);Convert(Node->m_pRight);BSTreeNode *Temp = Node->m_pLeft;Node->m_pLeft = Node->m_pRight;Node->m_pRight = Temp;}void OutPut(BSTreeNode *&Node)       //前序遍历输出树{if(Node == NULL)return ;cout<<Node->m_nValue<<" ";OutPut(Node->m_pLeft);OutPut(Node->m_pRight);}int main(){BSTreeNode *Node = NULL;BuildTree(Node,8);BuildTree(Node,6);BuildTree(Node,10);BuildTree(Node,5);BuildTree(Node,7);BuildTree(Node,9);BuildTree(Node,11);OutPut(Node);        //镜像转换前前序输出树cout<<endl;Convert(Node);       //镜像转换OutPut(Node);        //镜像转换后前序输出树cout<<endl;return 0;}


原创粉丝点击