题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
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
/ \
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
};
HANDWRITING:
first recursion:
void transform(BSTreeNode *root) {
if (root == 0) return ;
transform(root->m_pLeft);
transform(root->m_pRight);
BSTreeNode *c = root->m_pLeft;
root->m_pLeft = root->m_pRight;
root->m_pRight = c;
}
second loop:
void transform (BSTreeNode *root) {
stack<BSTreeNode *> ;
s.push(root);
while (!q.empty()) {
BSTreeNode *c = q.top();
q.pop();
q.push(c->m_pRight), q.push(c->m_pLeft);
BSTreeNode *t = c->m_pLeft;
c->m_pLeft = c->m_pRight;
c->m_pRight = t;
}
}
1、没有判断子节点是否为空,循环不能终止
ANSWER FROM:http://blog.csdn.net/v_july_v/article/details/6870251
This is the basic application of recursion.
PS: I don’t like the m_xx naming convension.
void swap(Node ** l, Node ** r) {
Node * p = *l;
*l = *r;
*r = p;
}
void mirror(Node * root) {
if (root == NULL) return;
swap(&(root->left), &(root->right));
mirror(root->left);
mirror(root->right);
}
void mirrorIteratively(Node * root) {
if (root == NULL) return;
stack<Node*> buf;
buf.push(root);
while (!stack.empty()) {
Node * n = stack.pop();
swap(&(root->left), &(root->right));
if (root->left != NULL) buf.push(root->left);
if (root->right != NULL) buf.push(root->right);
}
}
transform