/** * 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) {} * }; */ classSolution { public: TreeNode* inorderSuccessor(TreeNode* p){ // 如果它有右子树,找到右子树下的最左边的节点 if(p -> right){ p = p -> right; while(p -> left) p = p -> left; return p; }
// 如果它没有右子树,则寻找它的父亲节点,直到满足条件p == p -> father -> left // 那么 p -> father 就是 它的中序遍历的下一个节点 while(p -> father && p != p -> father -> left) p = p -> father; return p -> father; } };
时间复杂度
不论往上找还是往下找,总共遍历的节点数都不大于树的高度。所以时间复杂度是`O(h)`,其中 h 是树的高度。