题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
分析二叉树的下一个节点,一共有以下情况:
1.二叉树为空,则返回空;
2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。
参考代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <list>
#include <unordered_map>
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)
{
TreeLinkNode* next = pNode->right;
pNode = pNode->right;
while (pNode->left != NULL)
{
next = pNode->left;
pNode = pNode->left;
}
return next;
} else{
//右侧的那个节点时需要变动的,不是一直比较pNode,需要变动的
TreeLinkNode* parentnode = pNode->next;
TreeLinkNode* currentnode = pNode;
while (parentnode != NULL && parentnode->right == currentnode)
{
currentnode = parentnode;
parentnode = parentnode->next;
}
return parentnode;
}
}
};
int main() {
Solution solution;
TreeLinkNode TreeLinkNode1(1);
TreeLinkNode TreeLinkNode2(2);
TreeLinkNode TreeLinkNode3(3);
TreeLinkNode TreeLinkNode4(4);
TreeLinkNode TreeLinkNode5(5);
TreeLinkNode TreeLinkNode6(6);
TreeLinkNode TreeLinkNode7(7);
TreeLinkNode TreeLinkNode8(8);
TreeLinkNode TreeLinkNode9(9);
TreeLinkNode1.next = NULL;
TreeLinkNode1.left = &TreeLinkNode2;
TreeLinkNode1.right = &TreeLinkNode3;
TreeLinkNode2.next = &TreeLinkNode1;
TreeLinkNode2.left = &TreeLinkNode4;
TreeLinkNode2.right = &TreeLinkNode5;
TreeLinkNode3.next = &TreeLinkNode1;
TreeLinkNode3.left = &TreeLinkNode8;
TreeLinkNode3.right = &TreeLinkNode9;
TreeLinkNode4.next = &TreeLinkNode2;
TreeLinkNode4.left = NULL;
TreeLinkNode4.right = NULL;
TreeLinkNode5.next = &TreeLinkNode2;
TreeLinkNode5.left = &TreeLinkNode6;
TreeLinkNode5.right = &TreeLinkNode7;
TreeLinkNode6.next = &TreeLinkNode5;
TreeLinkNode6.left = NULL;
TreeLinkNode6.right = NULL;
TreeLinkNode7.next = &TreeLinkNode5;
TreeLinkNode7.left = NULL;
TreeLinkNode7.right = NULL;
TreeLinkNode8.next = &TreeLinkNode3;
TreeLinkNode8.left = NULL;
TreeLinkNode8.right = NULL;
TreeLinkNode9.next = &TreeLinkNode3;
TreeLinkNode9.left = NULL;
TreeLinkNode9.right = NULL;
cout<<solution.GetNext(&TreeLinkNode1)->val<<endl;
return 0;
}