剑指 Offer 之 二叉树的下一个节点
Contents
给定一棵二叉树和其中的一个节点,找出中序遍历顺序的下一个节点。树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。
分析
对于一棵如下的二叉树,其中序遍历为 {d, b, h, e, i, a, f, c, g}。
|  |  | 
有如下的规律:
- 
如果给定的节点有右子树,则该节点在中序遍历中的下一个节点就是其右子树中最左侧的节点。例如,给定节点为 b,则b的下一个节点就是以e为根节点的子树的最左边的节点,即h。同样的a的下一个节点就是f;
- 
如果给定的节点没有右子树,则需要判断其与父节点的关系: 
  2.1) 如果给定的节点是其父节点的左节点,则给定的节点的下一节点就是其父节点。例如,d->b,f->c;
  2.2) 如果给定的节点是其父节点的右节点,则可以沿着该节点的父指针向上找,直到找到一个是它父节点的左子节点的节点,找到则返回该节点,找不到则说明给定的节点没有下一节点,返回 null。
例如,给定节点 i 没有右子树,朝上找到 e 不满足条件,再找到 b,由于 a 的左节点是 b,所以 i 的下一节点就是 a 了。而对于 g 来说,向上找到 c 不满足条件,然后再找到 a 还是不满足条件,则说明 g 没有下一节点。
实现
|  |  | 
详解
第 4~9 行就对应上面讲到的第 1) 条,而第 12~14 行对应的就是第 2 条。