例题-二叉树的下一个节点

题目描述

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

思路

这道题给出的是二叉树的中序遍历,即左中右。在求下一个结点时,分一下几种情况讨论:

  1. 节点有右子树,找右子树中最左边的节点, 如图中C的下一个结点就是F;
  2. 节点没有右子树,且是其父节点的左子树,下个节点就是父节点, 如图中G的下一个结点就是E;
  3. 节点没有右子树,且是父节点的右子树,找下个节点,一直向上遍历,直到遇到一个节点是其父节点的左子树,那么父节点就是下个节点;如图中I的下一个结点是A。

代码实现

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
struct TreeLinkNode 
{
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL)
{}
};

class Tree {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == nullptr)
return nullptr;
if(pNode->right!=nullptr)
{ //1.节点有右子树,找右子树中最左边的节点
pNode = pNode->right;
if(pNode->left!=nullptr)
pNode = pNode->left;
return pNode;
}
while(pNode->next!=nullptr)
{//2.3.该结点无右子树
if(pNode->next->left == pNode)
return pNode->next;
pNode = pNode->next;
}
return nullptr;
}
};