二叉树镜像(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){}
};
贴代码:
给定源二叉树,设计算法实现其镜像。
思路:
对于二叉树问题,需要思考除递归方法外的非递归实现。
本题递归很好实现,对于遍历到的头结点,每次交换其左右子树即可。之后对其子树递归调用即可。
对于非递归实现,需要使用一个辅助栈,用于保存头结点。(层序遍历)
注:
二叉树结点定义如下:
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; }
相关文章推荐
- 有关于提高C/C++运行效率以及避免出现Bug的几种常见的实用方法
- 树的括号表示法(C语言版)
- C++ 表达式和运算符
- C++ 使用字符串
- LeetCode_Jump Game II
- 稀疏矩阵的快速转置(C语言版)
- 邻接表的实现与深度遍历
- 顺时针打印矩阵(C++版)
- C语言位运算符:与、或、异或、取反、左移和右移
- LeetCode_Jump Game
- C语言精华代码
- c++命令结束进程树
- C++中关于运算符 “.”和“->”的区分
- 【C语言提高12】间接赋值从0级指针到1级指针
- C语言根据路径打开文件内容
- codeforces 499B Lecture(map与string简单用法)
- 2015杭电新生赛1008游乐场【神坑】
- C++常量折叠
- 关于C++中各种运算符的总结和简要介绍
- C++11学习笔记8---错误处理