递归方法,比较抽象,可是也比较简介,代码以下: 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; } }