题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于
右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
当然也可以不使用递归,使用栈空间来辅助,从栈顶取出节点,交换左右节点,如果左右节点不为空,压入栈
右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
思路:这也是一个递归的题目,对于当前节点,如果不是NULL节点或者叶子节点,那么只需要交换左右子节点即可。这样再次递归调用左右子树。
void ConvertMirror(BinTree* root)
{
if(root == NULL ||(root->left == NULL &&root->right == NULL))
return ;
BinTree* temp = NULL;
temp = root->left;
root->left = root->right;
root->right = temp;
if(root->left != NULL)
ConvertMirror(root->left);
if(root->right != NULL)
ConvertMirror(root->right);
}
当然也可以不使用递归,使用栈空间来辅助,从栈顶取出节点,交换左右节点,如果左右节点不为空,压入栈
void ConvertMirrorNoIter(BinTree* root)
{
stack<BinTree*> st;
if(root == NULL)
return ;
st.push(root);
BinTree* temp;
while(!st.empty())
{
temp = st.top();
st.pop();
BinTree* cur = temp->left;
temp->left = temp->right;
temp->right = cur;
if(temp->left != NULL)
st.push(temp->left);
if(temp->right != NULL)
st.push(temp->right);
}
}