您的位置:首页 > 其它

二叉树的镜像20

2016-06-06 19:15 225 查看
画图让抽象问题形象化:画图是用来帮助自己分析、推理的常用手段,当问题比较抽象时,不如画出一些与题目相关的图形,辅助自己观察和思考。图形能使抽象的问题具体化、形象化。空想未必能找到题目中隐含的规律和特点。

题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。

二叉树结点定义:

struct BinTreeNode{
int m_value;
BinTreeNode *left;
BinTreeNode *right;
//创建根节点,值为e
BinTreeNode* createRoot(int e);
//将e作为当前结点的左孩子值插入
void insertAsLC(int e);
//将e作为当前结点的右孩子值插入
void insertAsRC(int e);
};


示例图片:



测试用例:

int main(){
//创建一颗二叉树
BinTreeNode *tree = new BinTreeNode;
tree->m_value = 8;

tree->insertAsLC(6); //左孩子为6
tree->insertAsRC(10);

tree->left->insertAsLC(5);
tree->left->insertAsRC(7);

tree->right->insertAsLC(9);
tree->right->insertAsRC(11);
//输出当前二叉树
levels(tree); //Output: 8 7 10 5 6 9 11

std::cout << std::endl;
//递归版二叉树的镜像
MirrorRecursively(tree);
//输出镜像
levels(tree); //Output: 8, 10, 7, 11, 9, 6, 5

return 0;
}


函数实现:

//递归版
void MirrorRecursively(BinTreeNode *pNode){
if(pNode == NULL)
return;
//如果没有左孩子和右孩子也要return
if(pNode->left == NULL && pNode->right == NULL)
return;
//否则交换左右孩子节点的值
//使用临时变量
BinTreeNode *temp = pNode->left;
pNode->left = pNode->right;
pNode->right = temp;
//继续检查是否有非叶节点的左右子节点
if(pNode->left)
MirrorRecursively(pNode->left);
if(pNode->right)
MirrorRecursively(pNode->right);
}


其他函数实现:

//创建根节点,值为e
BinTreeNode* BinTreeNode::createRoot(int e){
BinTreeNode *root = new BinTreeNode;
root->m_value = e;
return root;
}

//作为节点的左孩子插入元素e
void BinTreeNode::insertAsLC(int e){
BinTreeNode *Left = new BinTreeNode;
Left->m_value = e;
this->left = Left;
}

//作为节点的右孩子插入元素e
void BinTreeNode::insertAsRC(int e){
BinTreeNode *Right = new BinTreeNode;
Right->m_value = e;
this->right = Right;
}

//层次遍历,借助队列
void levels(BinTreeNode *root){
if(root == NULL)
return;
std::queue<BinTreeNode*> Q;
Q.push(root);
while(!Q.empty()){//如果队列不为空
//赋值x,避免造成死循环
BinTreeNode *x = Q.front();
//先访问根节点(队首)的值
std::cout << x->m_value << " ";
//访问后删除队首节点
Q.pop();
//如果有左孩子
if(x->left)
Q.push(x->left);//入队
//如果有右孩子
if(x->right)
Q.push(x->right);//入队
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: