题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点? 树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。(树的中序遍历指的是先打印左子树,然后打印根节点,最后打印右子树)

    我们以下图来分析二叉树的下一个节点
    二叉树的下一个节点 - 图1
    其中标在节点旁边的数字表示打印的顺序,比如节点 4 旁边标注 1,表示它是第一个被打印的,它的中序遍历的结果如下
    二叉树的下一个节点 - 图2
    我们分以下几种情况分析:

    1. 该节点有右子树,例如节点 4,节点 3等等,那么它的下一个节点就是它右子树中最左的节点,例如节点 4 右子树最左的节点是 7,所以它的下一个节点是 7,节点 3 的右子树的最左的节点是 8,所以它的下一个节点是 8

    二叉树的下一个节点 - 图3

    1. 该节点没有右子树,且父节点存在,并且它是它父节点的左孩子,那么它的父节点就是它的下一个节点,所以节点 5 的下一个节点是节点 3

    二叉树的下一个节点 - 图4

    1. 该节点没有右子树,父节点存在,并且也不是它父节点的左孩子,如节点 7,那么它就要一直向上寻找,直到某个节点是它父节点的左孩子,此时父节点就是下一个节点。如节点 7 不是它父节点的左孩子,向上寻找,来到父节点 4,它是它父节点的左孩子,所以节点 4 的父节点 2 是节点 7 的下一个节点 二叉树的下一个节点 - 图5
      如果向上寻找,没有找到某个节点是它父节点的左孩子,那么说明没有下一个节点,如节点 6 没有下一个节点
    2. 没有右子树,且父节点不存在,没有下一个节点

    完整代码如下:

    1. public class NextNode {
    2. // 二叉树的定义
    3. private static class BinaryTree {
    4. int value;
    5. // 还有一个指向父节点的指针
    6. BinaryTree parent;
    7. BinaryTree left;
    8. BinaryTree right;
    9. public BinaryTree(int value) {
    10. this.value = value;
    11. }
    12. }
    13. public static BinaryTree findNext(BinaryTree node) {
    14. if (node == null) {
    15. return null;
    16. }
    17. // 1. 如果有右子树,下一个节点是右子树的最左子树
    18. if (node.right != null) {
    19. BinaryTree next = node.right;
    20. while (next.left != null) {
    21. next = next.left;
    22. }
    23. return next;
    24. // 没有右子树,且父节点存在
    25. } else if (node.parent != null) {
    26. // 2. 如果是父节点的左孩子
    27. if (node == node.parent.left) {
    28. return node.parent;
    29. } else {
    30. // 3. 如果不是父节点的左孩子,向上寻找
    31. while (node.parent != null) {
    32. // 直到找到某节点是它父节点的左孩子,父节点是下一个节点
    33. if (node == node.parent.left) {
    34. return node.parent;
    35. }
    36. node = node.parent;
    37. }
    38. // 没有找到某节点是父节点的左孩子,没有下一个节点
    39. return null;
    40. }
    41. // 没有右子树,也没有父节点,那么也没有下一个节点
    42. } else {
    43. return null;
    44. }
    45. }
    46. }