为了找到二叉搜索树中的节点 pp 的中序后继,最直观的方法是中序遍历。由于只需要找到节点 pp 的中序后继,因此不需要维护完整的中序遍历序列,只需要在中序遍历的过程中维护上一个访问的节点和当前访问的节点。如果上一个访问的节点是节点 pp,则当前访问的节点即为节点 pp 的中序后继。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
Deque<TreeNode> stack=new ArrayDeque<TreeNode>();
TreeNode prev=null,curr=root;
while(!stack.isEmpty()||curr!=null){
while(curr!=null){
stack.push(curr);
curr=curr.left;
}
curr=stack.pop();
if(prev==p){
return curr;
}
prev=curr;
curr=curr.right;
}
return null;
}
}
反序中序遍历
思路及算法
本题中要求我们将每个节点的值修改为原来的节点值加上所有大于它的节点值之和。这样我们只需要反序中序遍历该二叉搜索树,记录过程中的节点值之和,并不断更新当前遍历到的节点的节点值,即可得到题目要求的累加树。
class Solution {
int sum=0;
public TreeNode convertBST(TreeNode root) {
if(root!=null){
convertBST(root.right);
sum=sum+root.val;
root.val=sum;
convertBST(root.left);
}
return root;
}
}