您的位置:首页 > 其它

第15 题:题目:输入一颗二元查找树,将该树转换为它的镜像

2011-07-26 13:19 429 查看
第15 题:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
定义二元查找树的结点为:
7
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 <vector>
#include <iostream>

using namespace std;

struct BSTreeNode
{

void reverseWithRecursion() //递归
{
BSTreeNode *temp = m_pLeft;
m_pLeft = m_pRight;
m_pRight = temp;

if (m_pLeft)
m_pLeft->reverseWithRecursion();
if (m_pRight)
m_pRight->reverseWithRecursion();
}

void reverseWithRecurrence() //循环
{

std::vector<BSTreeNode *> stack;

BSTreeNode *temp = m_pLeft;
m_pLeft = m_pRight;
m_pRight = temp;

if (m_pLeft)
stack.push_back(m_pLeft);
if (m_pRight)
stack.push_back(m_pRight);

while(stack.size() > 0)
{
BSTreeNode *node = stack[stack.size() - 1];

BSTreeNode *tempChild = node->m_pLeft;
node->m_pLeft = node->m_pRight;
node->m_pRight = tempChild;

stack.pop_back();

if (node->m_pLeft)
stack.push_back(node->m_pLeft);
if (node->m_pRight)
stack.push_back(node->m_pRight);
}
}

void printTree()
{
cout << m_nValue << endl;

std::vector<BSTreeNode *> stack;

if (m_pLeft)
stack.push_back(m_pLeft);

if (m_pRight)
stack.push_back(m_pRight);

while(stack.size() > 0)
{
BSTreeNode *node = stack[0];

cout << node->m_nValue << endl;

stack.erase(stack.begin());

if (node->m_pLeft)
stack.push_back(node->m_pLeft);
if (node->m_pRight)
stack.push_back(node->m_pRight);

}

}

int m_nValue;
BSTreeNode *m_pLeft;
BSTreeNode *m_pRight;
};

int main(void)
{
BSTreeNode node[12];

node[8].m_nValue = 8;
node[8].m_pLeft = &node[6];
node[8].m_pRight = &node[10];

node[6].m_nValue = 6;
node[6].m_pLeft = &node[5];
node[6].m_pRight = &node[7];

node[10].m_nValue = 10;
node[10].m_pLeft = &node[9];
node[10].m_pRight = &node[11];

node[5].m_nValue = 5;
node[5].m_pLeft = NULL;
node[5].m_pRight = NULL;

node[7].m_nValue = 7;
node[7].m_pLeft = NULL;
node[7].m_pRight = NULL;

node[9].m_nValue = 9;
node[9].m_pLeft = NULL;
node[9].m_pRight = NULL;

node[11].m_nValue = 11;
node[11].m_pLeft = NULL;
node[11].m_pRight = NULL;

node[8].reverseWithRecurrence();
node[8].printTree();

system("pause");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐