求二元查找树的镜像

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

例如输入:

     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
};

解题:

1.递归
void transform(BSTreeNode *tree)
{
    if(!tree)
        return ;

    BSTreeNode* temp;
    temp = tree->left;
    tree->left = tree->right;
    tree->right = temp;

    transform(tree->left);
    transform(tree->right);
}
2.循环
/****循环(前序)****/
void transform(BSTreeNode *tree)
{
    BSTreeNode* p = tree;
    Stack<BTNode*> S;
    while( p || !empty(S))
    {
        if(p)
        {            

            BSTreeNode* temp;
            temp = p->left;
            p->left = p->right;
            p->right = temp;
            
            push(p);

            p = p->left;
        }
        else
        {
            p = pop(S);

            p = p->right;
        }
    }
}

当然,也可以通过中序或者后序的方法来转换,也就是入栈和出栈的顺序改变一下。

 

posted @ 2014-02-25 22:56  idealing  阅读(228)  评论(0编辑  收藏  举报