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

来源:互联网 发布:五十知天命 英文翻译 编辑:程序博客网 时间:2024/05/22 05:40

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

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

采用的方法 是中序遍历 对吧  递归后 左子树 最后一个节点时 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 遍历

这三个性质结合起来考,真心的给力