中序遍歷的後繼
引例:給定一棵二叉樹的其中一個節點,請找出中序遍歷序列的下一個節點。本題還是要將規模縮小,考慮三個節點的簡單模型。可分爲兩種情況:
1.當前節點存在右節點:根據中序遍歷的規則,則當前節點的後繼是右節點的最左邊的節點。如圖中A節點的後繼是F,這是因爲A節點存在右節點C,所以沿着C節點的最左節點就是A的後繼。
2.當前節點不存在右節點。此時應該分兩步找:第一步,找到將該節點所在分支作爲右子樹的最高祖先節點;如果找不到,則它的父親節點就是後繼。第二步,該祖先的父親節點就是後繼。如圖中的E節點,第一個將E作爲右子樹的祖先是B,所以B的父親A就是後繼;再比如圖中的F,找不到一個祖先將它作爲右孩子,所以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) {
while(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;
}
};
這種做法最壞情況下複雜度是O(h),h爲樹的高度。