- 二叉树的下一个结点
- 题目:
返回中序遍历下给点结点pNode的后继; - 思路:
中序遍历是:左 中 右 ,因此按pNode是否有右子树分类判断;
/*
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) return pNode;
if (pNode->right) { //若有右子树,后继应该是pNode的右子树的左下角结点
pNode = pNode->right;
while (pNode->left) {
pNode = pNode->left;
}
return pNode;
}
while (pNode->next && pNode == pNode->next->right) {//否则往上层找, 直到pNode为其父亲的左孩子为止; 也可能找不到,说明pNode没有后继
pNode = pNode->next;
}
return pNode->next;//pNode已经是中序遍历的最后一个节点,因此后继为nullptr; 也可能找到了,后继为PNode的父亲
}
};
- 总结:
主要是加深中序遍历的理解