Inorder Successor in BST
阿新 • • 發佈:2018-12-09
Given a binary search tree and a node in it, find the in-order successor of that node in the BST.
在樹中尋找一個節點在中序遍歷下的後續節點,此類問題是帶條件的遍歷,設定某個條件,在遍歷過程中符合給定條件時,將節點存入結果,最終返回結果即可。如採用遞迴遍歷,結果可設為一個全域性變數ans,如需輔助變數也可設為全域性變數,否則應採用傳引用的方式傳入遍歷函式。 以上題目也個改為,前序、後序遍歷,或尋找前序節點,或尋找節點最大值 節點值為偶數的個數等。
遞迴解法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *ans,*pre;
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
ans=pre=NULL;
dfs(root,p);
return ans;
}
void dfs(TreeNode* root,TreeNode* p){
if(root==NULL) return;
dfs(root->left,p);
if(pre==p) ans=root;
pre=root;
dfs(root->right,p);
}
};
同樣,如果尋找前序節點,只需將條件替換為:
if(root==p) ans=pre;
pre=root;
條件複雜一點,尋找最大節點的後續節點:
TreeNode *ans,*pre,*maxnode;
if(maxnode==NULL || root->val>maxnode->val)
maxnode=root;
else if(pre==maxnode)
ans=root;
pre=root;
在樹中尋找節點了問題,幾乎都可以用此類方法解決。遞迴解法思路清晰,容易寫,但同樣也可以寫為非遞迴的形式。
class Solution {
public :
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
TreeNode* cur=root;
TreeNode* pre=NULL;
stack<TreeNode*> stk;
while(cur || !stk.empty()){
while(cur){
stk.push(cur);
cur=cur->left;
}
cur=stk.top();
stk.pop();
if(pre==p) return cur;
pre=cur;
cur=cur->right;
}
return NULL;
}
};