劍指OFFER之二叉搜索樹與雙向鏈表(九度OJ1503)

題目描述:

輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能建立任何新的結點,只能調整樹中結點指針的指向。測試

 

輸入:

輸入可能包含多個測試樣例。
對於每一個測試案例,輸入的第一行爲一個數n(0<n<1000),表明測試樣例的個數。
接下來的n行,每行爲一個二叉搜索樹的先序遍歷序列,其中左右子樹若爲空則用0代替。spa

 

輸出:

對應每一個測試案例,
輸出將二叉搜索樹轉換成排序的雙向鏈表後,從鏈表頭至鏈表尾的遍歷結果。指針

 

樣例輸入:
1
2 1 0 0 3 0 0

 

樣例輸出:
1 2 3

解題思路:

  這道題應該是最近寫的最繁瑣的一道題了。code

  首先輸入按規則來,須要進行前序遍歷輸入blog

void createTree(BTree **b){ int m; scanf("%d",&m); if(m == 0) *b = NULL; else{ BTree *s = (BTree *)malloc(sizeof(BTree)); s->data = m; s->lchild = NULL; s->rchild = NULL; *b = s; createTree(&((*b)->lchild)); createTree(&((*b)->rchild)); } }

  另外,總體的思路,是用一個指針記錄轉換的雙鏈表表尾。排序

  每次進行中序遍歷的轉換。io

  最早轉換的是最左下的節點,ast

void converNode(BTree *b,BTree **p){ if(b == NULL) return ; BTree *pnow = b; if(b->lchild != NULL) converNode(b->lchild,p); pnow->lchild = *p; if(*p != NULL) (*p)->rchild = pnow; *p = pnow; if(b->rchild != NULL) converNode(b->rchild,p); }

  每次遍歷節點的左孩子右孩子。把左孩子指向轉換鏈表的尾節點,並把末尾指針的右孩子指向本身。右孩子指向節點的右孩子。若是沒有右孩子就返回。下面是代碼思路的步驟:class

1 找到最左邊也就是最小的節點,PLast = NULL;搜索

 

2 讓節點的左孩子指向鏈尾,而後鏈尾指針右移。若是右孩子爲空就返回。

 

最後咱們從尾遍歷回頭指針返回。

所有代碼:

#include <stdio.h> #include <stdlib.h> typedef struct btree{ int data; struct btree *lchild,*rchild; }BTree; void createTree(BTree **b); void inorderTree(BTree *b); BTree * convert(BTree *b); void converNode(BTree *b,BTree **p); int main(){ int n; scanf("%d",&n); while(n--){ BTree *b = (BTree *)malloc(sizeof(BTree)); createTree(&b); BTree *head = convert(b); while(head!=NULL){ printf("%d ",head->data); head = head->rchild; } printf("\n"); } return 0; } BTree* convert(BTree *b){ BTree *pLast = NULL; converNode(b,&pLast); BTree *phead = pLast; while(phead != NULL && phead->lchild != NULL) phead = phead->lchild; return phead; } void converNode(BTree *b,BTree **p){ if(b == NULL) return ; BTree *pnow = b; if(b->lchild != NULL) converNode(b->lchild,p); pnow->lchild = *p; if(*p != NULL) (*p)->rchild = pnow; *p = pnow; if(b->rchild != NULL) converNode(b->rchild,p); } void createTree(BTree **b){ int m; scanf("%d",&m); if(m == 0) *b = NULL; else{ BTree *s = (BTree *)malloc(sizeof(BTree)); s->data = m; s->lchild = NULL; s->rchild = NULL; *b = s; createTree(&((*b)->lchild)); createTree(&((*b)->rchild)); } } /************************************************************** Problem: 1503 User: xhalo Language: C Result: Accepted Time:80 ms Memory:1704 kb ****************************************************************/
相關文章
相關標籤/搜索