学习笔记之树的镜像
2015-08-19 15:56
302 查看
前段时间去一家公司参加面试,碰到了一个问题,讲的是树的镜像问题,当时莫名其妙,后面想想应该是跟平面镜成像原理似的,回来研究后得出如下结论。
问题描述:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ /
6 10
// //
5 7 9 11
输出:
8
/ /
10 6
// //
11 9 7 5
定义二元查找树的结点为:
[cpp] view
plaincopyprint?
struct BSTreeNode
{
int value;
BSTreeNode *left;
BSTreeNode *right;
};
思路:题目要求用两种方法,递归和循环,其实质是一样的。
解法一:用递归。假设当前结点为pNode,只需交换该结点的左右子女,然后分别递归求解左子树和右子树即可。代码极为简单。
解法二:用循环,需要一个辅助栈完成,每次取栈顶元素交换左右子女,然后将左右子女分别压入辅助栈,当栈中元素为空时,结束循环。其实不论是递归也好,循环也好,都是利用栈的特性完成。
参考代码:
[cpp] view
plaincopyprint?
//函数功能 : 输入一颗二元查找树,将该树转换为它的镜像
//函数参数 : pRoot为根结点
//返回值 : 根结点
BSTreeNode * Mirror_Solution1(BSTreeNode * pRoot)
{
if(pRoot != NULL)
{
BSTreeNode * pRight = pRoot->right;
BSTreeNode * pLeft = pRoot->left;
pRoot->left = Mirror_Solution1(pRight); //转化右子树
pRoot->right = Mirror_Solution1(pLeft); //转化左子树
}
return pRoot;
}
[cpp] view
plaincopyprint?
BSTreeNode * Mirror_Solution2(BSTreeNode * pRoot)
{
if(pRoot != NULL)
{
stack<BSTreeNode *> stk; //辅助栈
stk.push(pRoot); //压入根结点
while(stk.size())
{
BSTreeNode *pNode = stk.top();
BSTreeNode *pLeft = pNode->left;
BSTreeNode* pRight = pNode->right;
stk.pop();
if(pLeft != NULL)
stk.push(pLeft);
if(pRight != NULL)
stk.push(pRight);
pNode->left = pRight; //交换左右子女
pNode->right = pLeft;
}
}
return pRoot;
}
问题描述:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ /
6 10
// //
5 7 9 11
输出:
8
/ /
10 6
// //
11 9 7 5
定义二元查找树的结点为:
[cpp] view
plaincopyprint?
struct BSTreeNode
{
int value;
BSTreeNode *left;
BSTreeNode *right;
};
思路:题目要求用两种方法,递归和循环,其实质是一样的。
解法一:用递归。假设当前结点为pNode,只需交换该结点的左右子女,然后分别递归求解左子树和右子树即可。代码极为简单。
解法二:用循环,需要一个辅助栈完成,每次取栈顶元素交换左右子女,然后将左右子女分别压入辅助栈,当栈中元素为空时,结束循环。其实不论是递归也好,循环也好,都是利用栈的特性完成。
参考代码:
[cpp] view
plaincopyprint?
//函数功能 : 输入一颗二元查找树,将该树转换为它的镜像
//函数参数 : pRoot为根结点
//返回值 : 根结点
BSTreeNode * Mirror_Solution1(BSTreeNode * pRoot)
{
if(pRoot != NULL)
{
BSTreeNode * pRight = pRoot->right;
BSTreeNode * pLeft = pRoot->left;
pRoot->left = Mirror_Solution1(pRight); //转化右子树
pRoot->right = Mirror_Solution1(pLeft); //转化左子树
}
return pRoot;
}
[cpp] view
plaincopyprint?
BSTreeNode * Mirror_Solution2(BSTreeNode * pRoot)
{
if(pRoot != NULL)
{
stack<BSTreeNode *> stk; //辅助栈
stk.push(pRoot); //压入根结点
while(stk.size())
{
BSTreeNode *pNode = stk.top();
BSTreeNode *pLeft = pNode->left;
BSTreeNode* pRight = pNode->right;
stk.pop();
if(pLeft != NULL)
stk.push(pLeft);
if(pRight != NULL)
stk.push(pRight);
pNode->left = pRight; //交换左右子女
pNode->right = pLeft;
}
}
return pRoot;
}
相关文章推荐
- 腾讯电面——C/C++基础之关键字
- 退出指南(4) - 如何选择一个公司
- 问题: ActivityManager: Warning: Activity not started, its current task has been brought to the front
- IOS第11天(2:UIPickerView自定义国旗选择)
- Csharp: read excel file using Open XML SDK 2.5
- 使用Kettle抽取MongoDB数据到Oracle
- hdu 1405
- c++ primer plus 第八章《编程题8.8.5》
- 小P的故事——神奇的换零钱
- (转载)KL距离
- 动态计算cell高度(1)
- java并发编程-Executor框架
- 关于Bean的知识private static final long serialVersionUID = 1L
- 常见26个jquery使用技巧详解(比如禁止右键点击、隐藏文本框文字等)
- C-1 九九乘法表
- 我的eclipse插件推荐
- 用CImage类来显示PNG、JPG等图片
- Android(java)学习笔记178:BroadcastReceiver之 自定义广播
- OpenGL ES 2.0 系列一
- HDU 1158 Employment Planning