剑指offer:二叉树的下一个结点
2016-04-07 15:14
316 查看
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针解题思路:
1、要求一个节点(比如说用node表示)的中序遍历的下一个节点,首先判断这个节点是否有右子树,如果有右子树,那么他的下一个节点就是他右子树上最左边的节点,例如图1中b的下一个节点为e。
2、如果这个节点没有右孩子,就需要判断这个节点有没有父节点,如果没有父节点,那么中序遍历时,他的下一个节点就是空,比如说根节点。
3、如果有父节点,就要看这个节点是不是他的父节点的左孩子。如果是,那么中序遍历时,他的下一个结点就是他的父节点,比如说图1中节点d的下一个节点就是他的父节点b。
4、如果他不是他的父节点的左孩子,也就是他是他父节点的右孩子。那么就需要向树根方向寻找到一个节点N,这个结点要么是空(比如图2中c节点中序遍历中的下一个节点就是空,就是根节点a的父节点,这里要注意没有节点,有三个指针:分别指向左右孩子的指针,还有一个是指向父节点的指针),要么是使得节点node所在的子树是这个节点N的左孩子(如图1中节点e的中序遍历中下一个节点是a)。
using namespace std;
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(NULL == pNode){
return NULL;
}
if (pNode->right != NULL){
return findLeft(pNode->right);
}
//如果结点的右子树为空
else {
//如果该结点没有父节点
if (pNode->next == NULL){
return NULL;
}
//如果该结点有父节点,他是父节点的左孩子
if (pNode->next->left == pNode){
return pNode->next;
}
//如果该结点有父节点,且他是父节点的右孩子
else
return findFatherNode(pNode->next);//寻找满足条件的父节点
}
}
TreeLinkNode* findLeft(TreeLinkNode *pNode){
if (pNode->left){
pNode = pNode->left;
}
return pNode;
}
TreeLinkNode* findFatherNode(TreeLinkNode *pNode){
while (pNode->next){
if(pNode->next->left == pNode){
return pNode->next;
}
pNode = pNode->next;
}
return NULL;
}
};
相关文章推荐
- 理解 Javascript 的闭包
- 样式设置
- 【剑指offer系列】 打印1到最大的n位数___12
- javascript闭包详解
- php的date对象与javascript的Date对象区别
- 通过原生js添加div和css
- AngularJs 过滤器
- 制作单页的动画插件
- ReactNative学习十三-Props和State
- js正则验证之不能使用相同字符
- Sass编译Css
- JQuery筛选器全系列介绍
- 去掉<textarea>中的html标签
- Gson使用总结
- jquery Ajax提交表单(使用jquery Ajax上传附件)
- 原生js 学习之array 数组
- node.js第一步
- JS学习1(JS实现,JS引入)
- 拖拽
- JS逻辑运算符&&与||的妙用