- 题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
/*
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)
{
}
};
- 分析
中序遍历的顺序为左根右,所以:
1.一个结点如果有右子树,那么其右子树的左子结点就是它的下一个结点。(因为遍历到当前结点之后应当遍历其右子树,然后再右子树中依旧按照左根右的顺序,当然如果其右子树没有左子结点,那么下一个结点就是右子树的根结点)
2.如果一个结点没有右子树,且该结点是其父结点的左子结点,那么它的下一个结点为其父结点;如果是父结点的右子结点,此时,我们需要向上遍历,直到找到一个结点是其父结点的子结点,当然如果这个父结点就是根结点,那么这个结点没有下一个结点,该二叉树中序遍历到这里就结束了。
ps:上面结构体中的next结点应该指的是其父结点(不晓得为什么要这么写)
例子:
a
/ \
b c
/ \ / \
d e f g
/ \
h i
/ \
j k
在上面的二叉树中,本身为左子结点的结点不提,对于结点e,有右子树,所以对右子树按照中序遍历,最开始的结点为j;而对于结点k,没有右子树,所以向上遍历,找到结点b是结点a的左子结点;而对于结点g,身为右子结点,且本身没有右子树,向上遍历又没有这样一个结点是其父结点的左子结点,因此g没有下一个结点。
- 代码
/*
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* pNext=NULL;
if(pNode->right!=NULL){
TreeLinkNode* pRight=pNode->right;
while(pRight->left != NULL){
pRight=pRight->left;
}
pNext=pRight;
}else if(pNode->next!=NULL){
TreeLinkNode* pCurrent=pNode;
TreeLinkNode* pParent=pNode->next;
while(pParent!= NULL && pCurrent==pParent->right){
pCurrent=pParent;
pParent=pParent->next;
}
pNext=pParent;
}
return pNext;
}
};