1.考点
- 考点1:对于中序遍历的理解;(也要对此拓展到前序遍历与后序遍历)
- 考点2:如何在一个二叉树中找到一个点的下一个点;(二叉树的结构理解)
2.思路
- 二叉树的前中后序遍历中,每种的遍历方式不同,对于找到某一个点的下一个点或上一个点的问题,只需要绘制出二叉树图,然后假设某一点为某节点的左节点/右节点,以及假设其有左子树也有右子树,那么这个节点就是一个X型结构,这个X型节点根据所述的上一节点与下一节点来考虑,以中序遍历(左根右)的寻找为例:
2.1 寻找下一节点:若有左子树,则左子树必为上一节点,故不考虑
- (1)若有右子树:则右子树必为下一节点;
- (2)若没有右子树,但自身是父节点的左节点:则父节点必为下一节点;
- (3)若没有右子树,但自身是父节点的右节点:沿着父节点往上找,直到找到那个自身是其父节点的左节点的点,取该节点的父节点作为下一节点;
- (4)若什么都没有:节点只有一个,也就不存在什么下一节点了,返回NULL。
2.2 寻找上一节点:若有右子树,则右子树必为下一节点,故不考虑
- (1)若有左子树:则左子树必为上一节点;
- (2)若没有左子树,但自身是父节点的右节点:则父节点必为上一节点;
- (3)若没有左子树,但自身是父节点的左节点:沿着父节点往上找,直到找到那个自身是其父节点的右节点的点,取该节点的父节点作为上一节点;
- (4)若什么都没有:节点只有一个,也就不存在什么上一节点了,返回NULL。
3.代码
#include <iostream>
using namespace std;
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;
if (pNode->right != NULL)
{
pNode = pNode->right;
while (pNode->left != NULL)
pNode = pNode->left;
return pNode;
}
else if (pNode->next != NULL)
{
if (pNode->next->left == pNode)
return pNode->next;
while (pNode->next != NULL && pNode != pNode->next->left)
pNode = pNode->next;
return pNode->next;
}
return NULL;
}
};
int main()
{
TreeLinkNode * node1 = new TreeLinkNode(1);
TreeLinkNode * node2 = new TreeLinkNode(2);
TreeLinkNode * node3 = new TreeLinkNode(3);
TreeLinkNode * node4 = new TreeLinkNode(4);
node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->next = node1;
node3->next = node1;
node4->next = node2;
Solution s;
cout << s.GetNext(node4)->val << endl;
}