您的位置:首页 > 职场人生

面试训练二叉搜索树建双向链表

2012-09-10 11:12 183 查看




这种题目看到的时候 ,我想的第一感觉 就是中序遍历二叉树。

但是至于链表如何来建,确实有些难度。要是不看书,真心搞不定。

采用的方法 是中序遍历 对吧 递归后 左子树 最后一个节点时 8 此时根结点为10 ,还未进入右子树递归。

那么只需将8和10建立链表,那么右子树如何处理呢,必须要有前一个节点10,才能够进入,同时因为是中序吧,遍历到最后面的节点时12 ,此时如果上一个节点时10那么肯定可以连起来,想想看,中序遍历 不是刚好10以后输出的12么,因此这里就有料了。

至于料是什么 当然是每次中序的递归遍历 保存上一个节点。并且左子树最后一个节点需要和根结点建立关系。

soga ,来coding了

#include "stdio.h"
typedef struct Node{
	 int key;
	 struct Node *left;
	 struct Node *right;
}Lnode;
void buildTree(Lnode **head)
{
	Lnode *p=NULL;
	int value;
	scanf("%d",&value);
	if(value ==-1)
	{
		*head=NULL;
	}
	else
	{
		
		p = (Lnode *)malloc(sizeof(Lnode));
		p->key = value;
		*head=p;
		buildTree(&((*head)->left));
		buildTree(&((*head)->right));
	}
	return;

}
void traverse(Lnode *p)
{
	if(p==NULL)
		return;
	printf("%d ",p->key);
	traverse(p->left);
	traverse(p->right);
}
void traverseList(Lnode *p)
{
	while(p!=NULL)
	{
		printf("%d ",p->key);
		p=p->right;
	}
}
void convertList(Lnode *head,Lnode **lastNode)
{
	Lnode *current = head;
	if(head == NULL)
		return;
	if(head->left)
		convertList(head->left,lastNode);
	head->left = *lastNode;
	if(*lastNode != NULL)
		(*lastNode)->right=head;
	*lastNode=current;
	if(head->right)
		convertList(head->right,lastNode);
}
Lnode *buildDouble(Lnode *head)
{
	Lnode *lastNode = NULL;
	Lnode *p=NULL;
	convertList(head,&lastNode);
	p=lastNode;
	while(p->left != NULL)
	{
		p=p->left;
	}
	return p; 
	
}
int main()
{

	Lnode *head=NULL;
	Lnode *listHead=NULL;
	int totalNum= 10;
	int index =0;
	int value=0;	
	buildTree(&head);
	traverse(head);
	printf("\n");
	listHead = buildDouble(head);
	traverseList(listHead);
	printf("\n");
	return 0;
}


这道题考察的非常好

1 递归

2 树

3 遍历

这三个性质结合起来考,真心的给力
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: