题目:输入一颗二元查找树(左节点小,右节点大cheng),将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
数据结构如下:
typedef struct BinaryTreeNode { int m_value; BinaryTreeNode *m_left; BinaryTreeNode *m_right; }*Tree_root;
在遍历二元查找树时每访问到一个结点,交换它的左右子树。这种思路用递归不难实现;
/* 由于递归的本质是编译器生成了一个函数调用的栈, 因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。 */ void MirrorRecursively(Tree_root root) { if(!root) return; BinaryTreeNode *temp = root->m_left; root->m_left = root->m_right ; root->m_right = temp; if(root->m_left) MirrorRecursively(root->m_left); if(root->m_right) MirrorRecursively(root->m_right); }
//下面是用栈来模拟实现 void Mirror_using_stack(Tree_root root) { if(!root) return; stack<BinaryTreeNode *>Binary_Stack; Binary_Stack.push(root); while(Binary_Stack.size()) { BinaryTreeNode *pNode = Binary_Stack.top(); Binary_Stack.pop(); BinaryTreeNode *temp = pNode->m_left; pNode->m_left = pNode->m_right ; pNode->m_right = temp; if(pNode->m_left) Binary_Stack.push(pNode->m_left); if(pNode->m_right) Binary_Stack.push(pNode->m_right); } }