软件设计艺术大师基本功--二叉树的镜像
2018-02-20 16:43
239 查看
Author: Frank
描述: 写一个函数,输入一个二叉树,输出它的镜像。
二叉树结点的定义:typedef struct BinaryTreeNode
{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BinaryTreeNode;分析:如下图所示二叉树
----镜像后-->
只需各个结点的左右指针互换即可(保证每个结点被操作一次),可以采用递归的方式:void MirrorRecursively(BinaryTreeNode* pHead)
{
if (NULL == pHead)
return;
if (NULL == pHead->left && NULL == pHead->right)
return;
BinaryTreeNode* pTemp = pHead->left;
pHead->left = pHead->right;
pHead->right = pTemp;
MirrorRecursively(pHead->left);
MirrorRecursively(pHead->right);
}
------------------------------代码测试------------------------------#include "stdafx.h"
#include "stdlib.h"
BinaryTreeNode* CreatBinaryNode(int data)
{
BinaryTreeNode* temp = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
temp->data = data; temp->left = NULL; temp->right = NULL;
return temp;
}
void PrintBinaryTree(BinaryTreeNode* pHead)
{
if (NULL == pHead)
return;
BinaryTreeNode* pNode = pHead;
printf("Node %d ", pNode->data);
PrintBinaryTree(pNode->left);
PrintBinaryTree(pNode->right);
}
int main()
{
BinaryTreeNode* pHead = NULL;
pHead = CreatBinaryNode(8);
pHead->left= CreatBinaryNode(6);
pHead->right = CreatBinaryNode(10);
pHead->left->left= CreatBinaryNode(5);
pHead->left->right = CreatBinaryNode(7);
pHead->right->left= CreatBinaryNode(9);
pHead->right->right = CreatBinaryNode(11);
PrintBinaryTree(pHead);
printf("----------------------------\n");
MirrorRecursively(pHead);
PrintBinaryTree(pHead);
getchar();
return 0;
}
描述: 写一个函数,输入一个二叉树,输出它的镜像。
二叉树结点的定义:typedef struct BinaryTreeNode
{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BinaryTreeNode;分析:如下图所示二叉树
----镜像后-->
只需各个结点的左右指针互换即可(保证每个结点被操作一次),可以采用递归的方式:void MirrorRecursively(BinaryTreeNode* pHead)
{
if (NULL == pHead)
return;
if (NULL == pHead->left && NULL == pHead->right)
return;
BinaryTreeNode* pTemp = pHead->left;
pHead->left = pHead->right;
pHead->right = pTemp;
MirrorRecursively(pHead->left);
MirrorRecursively(pHead->right);
}
//循环方式,借助stack来实现, 只需要能够将各个结点的左右指针交换且每个结点仅仅被操作一次即可!应该也可以借助队列来实现
using namespace std; #include <stack> void MirrorBinaryTree_while(BinaryTreeNode* root) { if (root == NULL) { return; } stack<BinaryTreeNode*> stackTreeNode; stackTreeNode.push(root); while (stackTreeNode.size() > 0) { BinaryTreeNode *parent = stackTreeNode.top(); stackTreeNode.pop(); BinaryTreeNode *Temp = parent->left; parent->left = parent->right; parent->right = Temp; if (parent->left) { stackTreeNode.push(parent->left); } if (parent->right) { stackTreeNode.push(parent->right); } } }
------------------------------代码测试------------------------------#include "stdafx.h"
#include "stdlib.h"
BinaryTreeNode* CreatBinaryNode(int data)
{
BinaryTreeNode* temp = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
temp->data = data; temp->left = NULL; temp->right = NULL;
return temp;
}
void PrintBinaryTree(BinaryTreeNode* pHead)
{
if (NULL == pHead)
return;
BinaryTreeNode* pNode = pHead;
printf("Node %d ", pNode->data);
PrintBinaryTree(pNode->left);
PrintBinaryTree(pNode->right);
}
int main()
{
BinaryTreeNode* pHead = NULL;
pHead = CreatBinaryNode(8);
pHead->left= CreatBinaryNode(6);
pHead->right = CreatBinaryNode(10);
pHead->left->left= CreatBinaryNode(5);
pHead->left->right = CreatBinaryNode(7);
pHead->right->left= CreatBinaryNode(9);
pHead->right->right = CreatBinaryNode(11);
PrintBinaryTree(pHead);
printf("----------------------------\n");
MirrorRecursively(pHead);
PrintBinaryTree(pHead);
getchar();
return 0;
}
相关文章推荐
- 软件设计艺术大师基本功--顺时针打印二维数组
- 软件设计艺术大师基本功--输出字符串中各个字符的组合(不是排列)
- 软件设计艺术大师基础--判断序列是否为二叉搜索树的后序遍历序列
- 急!很茫然,我是女生,本科美术系学艺术设计的今年7月份就毕业,软件专业也没学好,毕业之后不打算去公司里工作因为太勾心斗角太累了!现在天天都不开心我该怎么办怎么打算呢,有哪个好心人能给我讲解讲解!
- 云软件——艺术字符设计!【推荐】
- 【推荐】云软件——艺术字符设计
- 软件框架设计的艺术
- 云软件——艺术字符设计!【推荐】
- 对话软件大师Martin Fowler:进化型设计
- 软件框架设计的艺术
- 对话软件大师Martin Fowler:进化型设计
- 软件框架设计的艺术
- 云软件——艺术字符设计!【推荐】
- 领域驱动设计软件:核心复杂性应对之道(英文版)(众多世界级软件大师鼎力推荐)
- 高煥堂的课程:软件接口设计的技术与艺术
- 读书笔记_软件框架设计的艺术
- 云软件——艺术字符设计!【推荐】
- [IT名人堂]软件产业的设计大师:艾兰.库伯
- [笔记]软件框架设计的艺术
- 把写程序做为在创造艺术品,认为自己就是艺术设计大师,在创造一件艺术品,当有这中感觉时那么你成功了!