题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路
- 定义一个寻找根结点的函数,找到根结点,如果pNode本身为根结点,直接返回。
- 定义一个中序遍历函数,并用vector容器存储二叉树中序遍历序列。
- 找到容器中和pNode匹配的结点,返回结点的下一个结点即可。结点为空返回空,pNode在vector中的最后一个位置返回空。
代码实现
/*
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* FindpRoot(TreeLinkNode* pNode) // 寻找pNode所在二叉树的根结点
{
if(pNode == NULL) // 结点为空 返回NULL
return NULL;
if(pNode->next == NULL) // pNode为根结点直接返回该结点
return pNode;
TreeLinkNode* pRoot = pNode->next;
for( ;pRoot->next; pRoot = pRoot->next);
return pRoot;
}
void InOrderBiTree(TreeLinkNode* pRoot, vector<TreeLinkNode*> &vpNode) // 中序遍历二叉树
{
if(pRoot)
{
if(pRoot->left)
InOrderBiTree(pRoot->left, vpNode);
vpNode.push_back(pRoot);
if(pRoot->right)
InOrderBiTree(pRoot->right, vpNode);
}
}
TreeLinkNode* FindNextNode(TreeLinkNode* pNode, vector<TreeLinkNode*> &vpNode)
{
if(pNode == NULL) // 结点为空返回空
return NULL;
if(vpNode.empty()) // 容器为空 返回空
return NULL;
vector<TreeLinkNode*>::iterator iter = vpNode.begin(