經典題目——中序遍歷的後繼

中序遍歷的後繼

引例:給定一棵二叉樹的其中一個節點,請找出中序遍歷序列的下一個節點。
本題還是要將規模縮小,考慮三個節點的簡單模型。可分爲兩種情況:
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爲樹的高度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章