zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

二叉树下一个结点


题目描述

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

解题思路

中序遍历二叉树:先左树–>根结点–>右树。

image-20200606173643244

遍历顺序为:GDHBAEICF.

  • 若当前结点,有右子树树,则当前结点的下一个就是右子树的中序遍历的第一个结点。
  • 若当前结点,无右子树,但是他是双亲结点的左结点,则当前结点的下一个结点就是双亲结点;
  • 若当前结点,无右子树,且是双亲结点的右结点,则要一直返回到双亲结点,直到返回的双亲结点是某结点的左结点,停止。

代码

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
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 Solution
{
public:
TreeLinkNode* GetNext (TreeLinkNode* pNode)
{
if (pNode == NULL)
return NULL;

TreeLinkNode* pNext = NULL;
if (pNode->right != NULL)
{
TreeLinkNode* pRight = pNode->right;
while (pRight->left != NULL)
{
pRight = pRight->left;
}
pNext = pRight;
}
else if (pNode->next != NULL)
{
TreeLinkNode* pCur = pNode;
TreeLinkNode* pPar = pNode->next;

while (pPar != NULL && pCur == pPar->right)
{
pCur = pPar;
pPar = pCur->next;
}
pNext = pPar;
}
return pNext;
}

};

参考博文链接:https://cuijiahua.com/blog/2018/01/basis_57.html

文章作者:zerofly

发布时间:2020年06月06日 - 17:06

原始链接:http://zeroflycui.github.io/9fc3fc27.html

许可协议: 转载请保留原文链接及作者。