二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
想法
要求的是中序遍历的下一个结点,中序遍历的顺序是左根右。那么会有3种可能。
- 有右孩子,那么下一个就是右孩子的最左下角的孩子
- 无右孩子,是父节点的左孩子。那么下一个就是父节点。
- 无右孩子,是父节点的右孩子。那么下一个就是父节点一直往左上找到最左上的节点的父节点。
第一种:
第二种:
第三种:
我将第二和第三种放在一起处理了。
代码
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
// 第二第三种
if (pNode->right == NULL) {
while(pNode) {
if (pNode->next == NULL)
return NULL;
if (pNode->next->left == pNode)
return pNode->next;
pNode = pNode->next;
}
}
TreeLinkNode* p = pNode->right;
// 第一种
while(p->left != NULL)
p = p->left;
return p;
}
};