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

// 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;
}
posted @ 2016-11-16 10:04  wdan2016  阅读(830)  评论(0编辑  收藏  举报