遞歸方法,比較抽象,可是也比較簡介,代碼以下: class Successor { private: TreeNode * pre = new TreeNode(-1); //這個值其是取-1不太好,應該取一個不爲p的值 public: int findSucc(TreeNode* root, int p) { if(root == NULL) return -1; int curr = findSucc(root->left, p); if(curr == -1){//已是當前的最左節點 if(p == pre->val) return root->val; pre = root; return findSucc(root->right, p); } return curr;//表示直接找到了這個值,因此直接返回上一層就能夠了 } };
下面再看一個別人寫的使用棧來寫的非遞歸方法:java
import java.util.*; public class Successor { public int findSucc(TreeNode root, int p) { boolean isFound = false; Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode cur = root; while(cur!=null||!stack.isEmpty()){ while(cur!=null){ stack.add(cur); cur = cur.left; } if(!stack.isEmpty()){ TreeNode q = stack.pop(); if(isFound) return q.val; else if(q.val==p) isFound = true; cur = q.right; } } return -1; } }