题目来自牛客网:
请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。
给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。
其实考察了一下树的遍历算法而已。
下面给出示例代码:
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class Successor {
private TreeNode pre = new TreeNode(-1); //pre用来记录上一个结点的情况。
public int findSucc(TreeNode root, int p) {
// write code here
if (root == null)//如果结点为空,返回-1
return -1;
//首先从左子树寻找结点,用itr记录寻找的结果(找到返回下一结点的值,找不到返回-1);
int itr = findSucc(root.left, p);
//因为itr有2种结果,-1或者寻找到的结点的值非(-1),因此下面分情况来讨论。
if (itr == -1) { //itr为-1的情况。
//如果上一个节点中找到p,则该节点后其后继节点
if (pre.val == p) {
return root.val;
}
pre = root; //如果前一个节点不是,则pre指向root的对象。
return findSucc(root.right, p); // 然后对右子数进行相同的操作,并返回操作的结果值。
}
//如果itr返回的结果不是-1,那肯定是找到符合题意的结点了,所以直接返回值。
return itr;
}
}