题目:
输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/
6 10
/ /
5 7 9 11
输出:
8
/
10 6
/ /
11 9 7 5
思路:使用递归的话,前序、中序、后序都能很简单地完成这个问题。使用循环的话,也就是非递归,则需要使用层次遍历的方法,层级遍历一般则是借助了队列完成先进先出的功能。
如下,递归我采用稍微有点改变的中序遍历,队列我直接使用双向队列deque,包含了queue和stack的功能,比较方便。
//递归版本 void ReverseBST(TreeNode* root) { if(root!=NULL) { ReverseBST(root->left); swap(root->left, root->right); ReverseBST(root->left); //左右进行了交换,所以这里还用左结点 } } //循环版本 void ReverseBST2(TreeNode* root) { deque<TreeNode*> treeDeque; while(root!=NULL) { treeDeque.push_back(root->left); treeDeque.push_back(root->right); swap(root->left, root->right); if(treeDeque.empty()) { break; } else { root = treeDeque.front(); treeDeque.pop_front(); } } }