// test20.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<string.h>
#include<deque>
#include <forward_list>
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->left == NULL && pNode->right == NULL)//该节点是叶子节点;或者说该节点没有右孩子
if (pNode->right == NULL)//该节点是叶子节点;或者说该节点没有右孩子
{
if (pNode->next == NULL)//没有双亲
return NULL; //就这一个节点,没有双亲
else if (pNode->next->left == pNode) //是节点的左孩子
return pNode->next; //如果是左孩子,则返回双亲节点
else if (pNode->next->right == pNode) //是节点的右孩子
{
//判断该节点是否是节点的最右孩子,如果是最右孩子,返回NULL
TreeLinkNode* parent = pNode->next;
while (parent->next!=NULL)
{
parent = parent->next; //找到根节点
}
while (parent->right!=NULL)//找到最右节点
{
parent = parent->right;
}
if (parent == pNode) return NULL;
return pNode->next->next;
}
}
//如果该节点有右孩子,则返回右孩子的最左节点
pNode = pNode->right;
while (pNode->left!=NULL)
{
pNode = pNode->left;
}
return pNode;
}
};
int main()
{
// //vector<int> vec = { 49,38,65,97,76,13,27};
//vector<int> vec1 = { 49,38};
//vector<int> vec = { 1,2,3,4,5,6,7,0};
TreeLinkNode* t1 = new TreeLinkNode(8);
TreeLinkNode* t2 = new TreeLinkNode(6);
TreeLinkNode* t3 = new TreeLinkNode(10);
TreeLinkNode* t4 = new TreeLinkNode(5);
TreeLinkNode* t5 = new TreeLinkNode(7);
TreeLinkNode* t6 = new TreeLinkNode(9);
TreeLinkNode* t7 = new TreeLinkNode(11);
t1->left = t2;
t1->right = t3;
t2->left = t4;
t2->right = t5;
t3->left = t6;
t3->right = t7;
t2->next = t1;
t3->next = t1;
t4->next = t2;
t5->next = t2;
t6->next = t3;
t7->next = t3;
Solution so;
if (so.GetNext(t1) == NULL)
{
cout << "没有下一个节点" << endl;
}
else {
cout << "so.GetNext(t1):" << so.GetNext(t1)->val << endl;
}
return 0;
}