时间限制:1秒 空间限制:32768K 热度指数:213647
本题知识点: 树
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
方法:以中序遍历,则考虑当前遍历的结点的情况,若当前结点存在右子树,则右子树的的最左端的结点即为遍历的下一个结点;若当前结点不存在右子树,则当前结点一直向上寻找父节点,直到某个结点充当的是左结点的身份,则返回其父节点即可
代码如下:
/*
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(pNode == NULL) return NULL;
TreeLinkNode* next=NULL;
//当前结点有右子树,那么它的下一个结点就是它的右子树中最左子节点
if(pNode->right!=NULL){
TreeLinkNode *right=pNode->right;
while(right->left!=NULL){
right=right->left;
}
next=right;
}else if(pNode->next!=NULL){
//当前结点无右子树,则需要找到一个是它父节点的左子树结点的结点
TreeLinkNode *cur = pNode;
//父节点
TreeLinkNode *fa=pNode->next;
while(fa!=NULL&&cur==fa->right){
cur=fa;
fa=cur->next;
}
next=fa;
}
return next;
}
};