求二元查找树的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
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; } } }
当然,也可以通过中序或者后序的方法来转换,也就是入栈和出栈的顺序改变一下。