您的位置:首页 > 编程语言 > C语言/C++

二叉树镜像(C++版)

2015-11-30 21:28 549 查看
题目:

给定源二叉树,设计算法实现其镜像。

思路:

对于二叉树问题,需要思考除递归方法外的非递归实现。

本题递归很好实现,对于遍历到的头结点,每次交换其左右子树即可。之后对其子树递归调用即可。

对于非递归实现,需要使用一个辅助栈,用于保存头结点。(层序遍历)

注:

二叉树结点定义如下:

typedef int dataType;

struct Node

{

dataType val;

struct Node *left;

struct Node *right;

Node(dataType _val):

val(_val), left(NULL), right(NULL){}

};
贴代码:

void Mirror(TreeNode *pRoot)
{
if(0)
{
// 递归实现
if(pRoot == NULL)
{
return;
}

TreeNode *temp;
temp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = temp;

Mirror(pRoot->left);
Mirror(pRoot->right);
}
else
{
// 非递归实现 (需要使用辅助栈)

stack<TreeNode*> stk;

if(pRoot == NULL)
{
return;
}
stk.push(pRoot);

// 如果堆栈不为空 说明还需要往下层遍历
while(!stk.empty())
{
// 获取当前遍历子树头结点
TreeNode *head = stk.top();
stk.pop();

// 头结点任意子树不为空 就需要交换
if(head->left || head->right)
{
TreeNode *temp;
temp = head->left;
head->left = head->right;
head->right = temp;
}

// 压入新头结点
if(head->left)
{
stk.push(head->left);
}
if(head->right)
{
stk.push(head->right);
}
}
}

return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: