题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于
右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
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); } }
时间: 2024-10-10 04:07:45