题目描述
给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。
注意:
如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;
样例
给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]
返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:
3
/ \
9 20
/ \
15 7
算法
思路如下 :主要有两种情况
1. 该节点是否有右孩子 如果有右孩子则我们只要找到该节点的最底层左孩子即可
2. 如果没有有孩子 向上溯源找到其father 节点的father节点就可以
时间复杂度 最大就是遍历到整个树的最底层 O(h)
C++ 代码
/**
* 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==p->father->right)p=p->father;
return p->father;//如果没有父节点,我们只要直接发返回就可以了,因为这就意味着该节点是一个单个的节点
}
};