题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点? 树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。(树的中序遍历指的是先打印左子树,然后打印根节点,最后打印右子树)
我们以下图来分析二叉树的下一个节点
其中标在节点旁边的数字表示打印的顺序,比如节点 4 旁边标注 1,表示它是第一个被打印的,它的中序遍历的结果如下
我们分以下几种情况分析:
- 该节点有右子树,例如节点
4,节点3等等,那么它的下一个节点就是它右子树中最左的节点,例如节点4右子树最左的节点是7,所以它的下一个节点是7,节点3的右子树的最左的节点是8,所以它的下一个节点是8

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

- 该节点没有右子树,父节点存在,并且也不是它父节点的左孩子,如节点
7,那么它就要一直向上寻找,直到某个节点是它父节点的左孩子,此时父节点就是下一个节点。如节点7不是它父节点的左孩子,向上寻找,来到父节点4,它是它父节点的左孩子,所以节点4的父节点2是节点7的下一个节点
如果向上寻找,没有找到某个节点是它父节点的左孩子,那么说明没有下一个节点,如节点6没有下一个节点 - 没有右子树,且父节点不存在,没有下一个节点
完整代码如下:
public class NextNode {// 二叉树的定义private static class BinaryTree {int value;// 还有一个指向父节点的指针BinaryTree parent;BinaryTree left;BinaryTree right;public BinaryTree(int value) {this.value = value;}}public static BinaryTree findNext(BinaryTree node) {if (node == null) {return null;}// 1. 如果有右子树,下一个节点是右子树的最左子树if (node.right != null) {BinaryTree next = node.right;while (next.left != null) {next = next.left;}return next;// 没有右子树,且父节点存在} else if (node.parent != null) {// 2. 如果是父节点的左孩子if (node == node.parent.left) {return node.parent;} else {// 3. 如果不是父节点的左孩子,向上寻找while (node.parent != null) {// 直到找到某节点是它父节点的左孩子,父节点是下一个节点if (node == node.parent.left) {return node.parent;}node = node.parent;}// 没有找到某节点是父节点的左孩子,没有下一个节点return null;}// 没有右子树,也没有父节点,那么也没有下一个节点} else {return null;}}}
