這種題目看到的時候 ,我想的第一感覺 就是中序遍曆二叉樹。
但是至於鏈表如何來建,確實有些難度。要是不看書,真心搞不定。
採用的方法 是中序遍曆 對吧 遞迴後 左子樹 最後一個節點時 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 遍曆
這三個性質結合起來考,真心的給力