这种题目看到的时候 ,我想的第一感觉 就是中序遍历二叉树。
但是至于链表如何来建,确实有些难度。要是不看书,真心搞不定。
采用的方法 是中序遍历 对吧 递归后 左子树 最后一个节点时 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 遍历