剑指Offer_57

题目

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

解题思路

二叉树的中序遍历要熟悉

点击加载

该二叉树的中序遍历为:
G D H B E A K C I J F

a. 如果该节点有右子树,那么找该右子树的最左子树节点。

比如输入的节点为C,它有右子树,那么就找其右子树的最左节点 I

b. 如果没有右子树,节点A的父节点的左子树等于该节点A,那么节点A的父节点就是下一节点,否则继续向上搜索

比如输入的节点为H,它的父亲节的左子树不是它本身,那么就要向上搜索,
令pNode = pNode.next,此时PNode = D,它的父节点B就是下一节点

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
33
34
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode == null){
return pNode;
}
if(pNode.right != null){
pNode = pNode.right;
while(pNode.left != null){
pNode = pNode.left;
}
return pNode;
}
while(pNode.next != null){
if(pNode.next.left == pNode){
return pNode.next;
}
pNode = pNode.next;
}
return null;
}
}