剑指offer阅读笔记 之面试题19 实现二叉树的镜像 之 又复习一遍二叉树
2016-06-22 20:43
411 查看
数据结构里,二叉树是个稍微复杂的数据结构,关于树的问题也都相对复杂,利用树解题的方法也较多,想要掌握树,要掌握最基本的树的遍历,温故而知新,求二叉树的镜像,其实就是遍历二叉树的结点,如果该结点有左孩子或者右孩子则交换连个孩子。 树的遍历有递归和循环两种方法,当然遍历有前序,中序,后序 。这里使用前序遍历法,以后再写中序和后序吧。
镜像二叉树的递归实现:
///////////////////////////////面试题19 镜像二叉树 递归实现
void MirrorRecursively(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
{
return;
}
if (pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL)
{
return;
}
BinaryTreeNode* pTemp = pRoot->m_pLeft;
pRoot->m_pLeft = pRoot->m_pRight;
pRoot->m_pRight = pTemp;
if (pRoot->m_pLeft)
{
MirrorRecursively(pRoot->m_pLeft);
}
if (pRoot->m_pRight)
{
MirrorRecursively(pRoot->m_pRight);
}
}循环实现,循环遍历二叉树最关键的一点是使用栈存放结点值。
/////////////////////////////// 循环实现 遍历树需要 用栈
void MirrorIteratively(BinaryTreeNode* pRoot)
{
if (pRoot == NULL)
{
return;
}
std::stack<BinaryTreeNode*> stackTreeNode;
stackTreeNode.push(pRoot);
while(stackTreeNode.size()>0)
{
BinaryTreeNode* pNode = stackTreeNode.top();
stackTreeNode.pop();
BinaryTreeNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = pTemp;
if (pNode->m_pLeft)
{
stackTreeNode.push(pNode->m_pLeft);
}
if (pNode->m_pRight)
{
stackTreeNode.push(pNode->m_pRight);
}
}
return;
}对二叉树的遍历理解清楚了,这道题也就迎刃而解了,对我更多的是又复习一遍二叉树的遍历。温故而知新。
镜像二叉树的递归实现:
///////////////////////////////面试题19 镜像二叉树 递归实现
void MirrorRecursively(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
{
return;
}
if (pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL)
{
return;
}
BinaryTreeNode* pTemp = pRoot->m_pLeft;
pRoot->m_pLeft = pRoot->m_pRight;
pRoot->m_pRight = pTemp;
if (pRoot->m_pLeft)
{
MirrorRecursively(pRoot->m_pLeft);
}
if (pRoot->m_pRight)
{
MirrorRecursively(pRoot->m_pRight);
}
}循环实现,循环遍历二叉树最关键的一点是使用栈存放结点值。
/////////////////////////////// 循环实现 遍历树需要 用栈
void MirrorIteratively(BinaryTreeNode* pRoot)
{
if (pRoot == NULL)
{
return;
}
std::stack<BinaryTreeNode*> stackTreeNode;
stackTreeNode.push(pRoot);
while(stackTreeNode.size()>0)
{
BinaryTreeNode* pNode = stackTreeNode.top();
stackTreeNode.pop();
BinaryTreeNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = pTemp;
if (pNode->m_pLeft)
{
stackTreeNode.push(pNode->m_pLeft);
}
if (pNode->m_pRight)
{
stackTreeNode.push(pNode->m_pRight);
}
}
return;
}对二叉树的遍历理解清楚了,这道题也就迎刃而解了,对我更多的是又复习一遍二叉树的遍历。温故而知新。
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- AVL树-自平衡二叉查找树(Java实现)
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- C#数据结构之顺序表(SeqList)实例详解
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(七):数据结构详解
- Lua教程(二):C++和Lua相互传递数据示例
- 一道sql面试题附答案
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C# 超高面试题收集整理
- C#数据结构之单链表(LinkList)实例详解
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏