版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/85543835
给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。
注意:
如果给定的节点是中序遍历序列的最后一个,则返回空节点;
二叉树一定不为空,且给定的节点一定不是空节点;
样例
假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。
则应返回值等于3的节点。
解释:该二叉树的结构如下,2的后继节点是3。
2
/ \
1 3
后继节点是中序遍历中的下一个元素,也就是二叉搜索树中比这个数大的最小的元素,二叉搜索树中最大的元素没有后继
[image:2F9529F0-0A82-4956-94A5-09EE157B5F7B-515-0000096C16E6A265/屏幕快照 2019-01-01 下午3.29.25.png]
-
二叉树中某个节点如果有右子树,则右子树最左边的元素是后继,如F的后继为H
-
如果某个节点没有右子树,且为其父节点的左儿子,则它的父节点就是它的后继,如B的后继为D
-
如果某个节点没有右子树,且为其父节点的右儿子,则它向上找第一个为左儿子的节点的父节点是它的后继,如D的后继为F
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode *father;
* TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {}
* };
*/
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode *p) {
if (p->right) {
p = p->right;
while (p->left) p = p->left;
return p;
}
while (p->father && p->father->right == p) p = p->father;
return p->father;
}
};