JSMS39-二叉搜索树转双向链表-剑指offer27

209 阅读1分钟

题目描述,就是将二叉搜索树转成双向链表。

解析:这道题是将二叉搜索树转成双向链表。二叉树结点中有left指针和right指针,在双向链表中left指针指向上一个结点,而right指针指向下一个结点就行了。二叉搜索树转换成双向链表的过程是左子树指向父结点,父结点指向右子树,递归的解决左半部分,然后递归的解决右半部分,是典型分治思想分而治之的题目。

#include <stdio.h>
#include <stdlib.h>

typedef struct d{
	int data;
	struct d *left;
	struct d *right;
}tree;

tree *createTree(int *a,int &n)     //创建一棵二叉搜索树
{
	int num=a[n++];
	if(num==NULL)
	{
		return NULL;
	}
	tree *s=(tree *)malloc(sizeof(tree));
	s->data=num;
	s->left=createTree(a,n);
	s->right=createTree(a,n);
	return s;
}

void Lat(tree *t)       //递归后序遍历
{
	if(t!=NULL)
	{
		Lat(t->left);
		Lat(t->right);
		printf("%d->",t->data);
	}else
	{
		return;	
	}
}

void convertNode(tree *pNode,tree *&p)     //
{
	if(pNode==NULL)              //树根节点为NULL返回
	{
		return;	
	}else
	{
		tree *pCurrent=pNode;   
		if(pCurrent->left!=NULL)    //当前的P结点的left不为空
		{
			convertNode(pCurrent->left,p);    //递归解决左边部分
		}
		pCurrent->left=p;         //第一次进去叶节点的left指向p,p第一次的时候为NULL
		if(p!=NULL)
		{
			p->right=pCurrent;   //p不为NULL的时候,p->right指向根节点
		}
		p=pCurrent;             //p指向根结点
		if(pCurrent->right!=NULL)     //p的右子树不为NULL,递归解决右半部分
		{
			convertNode(pCurrent->right,p);
		}
	}
}


tree *convert2Link(tree *t)    //转换的函数
{
	tree *p=NULL;
	convertNode(t,p);
	tree *listHead=p;
	while(listHead!=NULL&&listHead->left!=NULL)
	{
		listHead=listHead->left;
		
	}
	return listHead;
} 

void print(tree *t)
{
	printf("I am here!\n");
	for(;t!=NULL;t=t->right)
	{	
		printf("%d->",t->data);
	} 
}

int main()
{
	int a[]={10,6,4,0,0,8,0,0,14,12,0,0,16,0,0};
	int n=0;
	tree *t=createTree(a,n);
	Lat(t);	
	tree *ret=convert2Link(t);
	print(ret);
}