码迷,mamicode.com
首页 > 其他好文 > 详细

《剑指offer》:[58]二叉树的下一个结点

时间:2016-06-29 11:19:51      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

题目:给定一棵二叉树和其中一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针外,还有一个指向父节点的指针。
分析:这里已经说了是中序遍历,所以我们就以中序遍历为例。由于是二叉树,所以有三种情况;
(1)如果如果一个结点有右子树,那么它的下一个结点就是它的右子树中最左子节点。也就是说从右子节点出发一直沿着指向左子结点的指针,我们就能找到它的
下一个结点。
(2)如果这个结点没有右子树,如果结点是它父节点的左子树,则它的下一个结点就是它的父节点。
(3)如果一个结点没有右子树,并且是它父结点的右子树,那么旗下一个结点就是沿着指向父指针的结点向上找,直到找到一个是它父结点的左子结点的结点。如果这样的结点存在则该结点的父节点就是下一个结点。

说的可能不直观,我们用3张图来来直观的解释一下上述三种情况,因为我觉得一张简单的图远比长篇大论要简洁易懂,所以我的笔记里有很多图,可能画的不好!

技术分享

具体实现代码如下:
#include <iostream>
using namespace std;
struct BinaryTree
{
	int data;
	BinaryTree *pLeft;
	BinaryTree *pRight;
	BinaryTree *pParent;
};
BinaryTree *pRoot=NULL;
int arr[7]={10,6,15,4,5,12,18};
void InSertTree(BinaryTree *root1,int data)
{
	//插入在左边;
	if(root1->data > data)
	{
		if(root1->pLeft==NULL)
		{
			BinaryTree *node=new BinaryTree;
			node->data=data;
			node->pLeft=node->pRight=NULL;
			node->pParent=root1;
			root1->pLeft=node;
		}
		else
		{
			InSertTree(root1->pLeft,data);
		}
	}
	//插入在右边;
	else
	{
		if(root1->pRight==NULL)
		{
			BinaryTree *node=new BinaryTree;
			node->data=data;
			node->pLeft=node->pRight=NULL;
			node->pParent=root1;
			root1->pRight=node;
		}
		else
		{
			InSertTree(root1->pRight,data);
		}
	}
}
void CreateTree(BinaryTree **root,int length,int *array)
{
	for(int i=0;i<length;i++)
	{
		if(*root==NULL)
		{
			BinaryTree *pNode=new BinaryTree;
			pNode->data=array[i];
			pNode->pLeft=pNode->pRight=NULL;
			*root=pNode;
		}
		else
			InSertTree(*root,array[i]);
	}
}
BinaryTree *GetNextNode(BinaryTree* pNode)
{
	if(pNode==NULL)
		return NULL;
	BinaryTree *pNext=NULL;
	if(pNode->pRight!=NULL)
	{
		BinaryTree *right=pNode->pRight;
		while(right->pLeft!=NULL)
			right=right->pLeft;//找到最左边的一个节点;
		pNext=right;
	}
	else if(pNode->pParent!=NULL)
	{
		BinaryTree *pCurrent=pNode;
		BinaryTree *parent=pNode->pParent;
		while(parent!=NULL && pCurrent==parent->pRight)
		{
			pCurrent=parent;
			parent=parent->pParent;
		}
		pNext=parent;
	}
	return pNext;
}
int main()
{
	BinaryTree *result=NULL;
	CreateTree(&pRoot,7,arr);
	result=GetNextNode(pRoot);
	if(NULL==result)
		cout<<"输入的结点不存在!"<<endl;
	else
		cout<<pRoot->data<<"的下一个结点为:"<<result->data<<endl;
	system("pause");
	return 0;
}

输入的二叉树是:

技术分享

运行结果:

技术分享


《剑指offer》:[58]二叉树的下一个结点

标签:

原文地址:http://blog.csdn.net/gogokongyin/article/details/51778339

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!