剑指offer_【57】二叉树的下一个结点

1.题目描述

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

2.解题思路

情况1:该节点有右子树:

         6

     /      \

   3         10

 /   \      /    \

2     5    8      12

中序遍历结果为:2–>3–>5–>6–>8–>10–>12

即它的下一个结点就是它的右子树中最左子结点

情况2.1:该节点无右子树:(为父节点6的左子节点)

        6

     /     \

   3        10

  /        /    \

2         8      12

2–>3–>6–>8–>10–>12

该节点是父节点的左子节点的这种情况比较简单,直接将父节点返回即可

情况2.2:该节点无右子树:(为父节点6的右子节点)

          6

       /    \

     3        10

  /     \     /   \

2       5    8    null

2–>3–>6–>8–>10 –>null

如果是父节点的右子节点的话,需要不断的向上移动,直到对应的节点不是父节点的右节点(即左节点),既然他是父节点的左节点,此时将这个节点父节点返回即可,或者遍历到了根节点,返回null;

3.代码

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
35
36
37
38
39
40
41
42
43
/*
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 null;
}
//该节点有右子树,它的下一个结点就是它的右子树中最左子结点

if(pNode.right != null){
pNode = pNode.right;
while(pNode.left != null){
pNode = pNode.left;
}
return pNode;
}
//该节点无右子树,父节点不为空

while(pNode.next != null){
//pNode为父节点的左节点为该节点,直接返回父节点
if(pNode.next.left== pNode){
return pNode.next;
}
//为父节点的右子节点,不断的向上移动,直到对应的节点不是父节点的左子节点
//一直回溯如果遍历到他是父节点的左节点,此时将这个节点父节点返回即可,
//或者遍历到了根节点,返回null;

pNode = pNode.next;
}
return null;
}
}
文章目录
  1. 1. 1.题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
| 139.6k