1. 程式人生 > >Inorder Successor in BST

Inorder Successor in BST

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; } };