剑指 Offer 08 二叉树的下一个节点 (此题力扣没有)

题目描述

给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。

注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。

下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示。

基本思路

binaryTree_nextNode.jpg

节点(设为x)中序遍历的下一个节点有以下可能:

  1. 若x有右子树。则x的下一个节点为x右子树最左侧节点。如,2的下一个节点为8。
  2. 若x没有右子树,又分为2种情况:
  3. 若x是父节点的左孩子。则x的父节点就是x的下一个节点。如,7的下一个节点是4。
  4. 若x是父节点的右孩子。则沿着父节点向上,直到找到一个节点的父节点的左孩子是该节点,则该节点的父节点就是x的下一个节点。如,9的下一个节点是1。

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null; next指向父节点

TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
TreeLinkNode root = pNode;
if (root.right != null) {
root = root.right;
while (root.left != null) root = root.left;
return root;
}
TreeLinkNode root2 = pNode;
while (root2.next != null) {
if (root2.next.left == root2) {
return root2.next;
}
root2 = root2.next;

}
return null;

}
}