第4章第1節練習題6 二叉樹葉子節點連結成單鏈表
阿新 • • 發佈:2019-02-20
問題描述
設計一個演算法,將二叉樹的葉子節點按從左到右的順序連成一個單鏈表,表頭指標為head。連結時用葉子節點的右指標來存放單鏈表指標。
演算法思想
題目要求將葉子節點按自左向右的次序連線成一個單鏈表,因此很容易考慮到的便是將整棵二叉樹按照先序或中序或後序的方式遍歷一次。
在遍歷的過程中對葉子節點單獨判斷,如果是葉子節點,則將其做一個標識(比如用額外的指標指向該節點),接著遍歷下一個葉子節點,遍歷到另一個葉子節點後,然後讓已被標識的葉子節點的右孩子指向該節點,依次類推便可以實現將葉子節點連線成單鏈表。
整個過程有點類似於尾插法建立單鏈表。
演算法描述
這裡使用中序遍歷的方式實現,還可以考慮使用先序遍歷,後序遍歷的方式。
但是不能使用層次遍歷,主要是因為層次遍歷可能會導致單鏈表從右邊連結到左邊再到右邊的情況。不合題意,故舍去。
static LNode* head=NULL;
static LNode* r=NULL;
void CreateList(BiTNode* T){
if(T==NULL){
return;
}
CreateList(T->lchild);
if(T->lchild==NULL&&T->rchild==NULL){
if (r==NULL){
head=T;
}else{
r->rchild=T;
}
r=T;
}
CreateList(T->rchild);
}
具體程式碼見附件
附件
//AB#DG###CE##F##
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTNode LNode;
static LNode* head=NULL;
static LNode* r=NULL;
//--------------------------------------------------------------
BiTNode* CreateBiTree(BiTNode*);
void CreateList(BiTNode*);
void Print(LNode*);
//--------------------------------------------------------------
int main(int argc, char* argv[]){
BiTNode* T=(BiTNode*)malloc(sizeof(BiTNode));
T=CreateBiTree(T);
CreateList(T);
Print(head);
return 0;
}
BiTNode* CreateBiTree(BiTNode* T){
ElemType x;
scanf("%c",&x);
if(x=='#'){
return NULL;
}
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=x;
T->lchild=CreateBiTree(T->lchild);
T->rchild=CreateBiTree(T->rchild);
return T;
}
//--------------------------------------------------------------
void CreateList(BiTNode* T){
if(T==NULL){
return;
}
CreateList(T->lchild);
if(T->lchild==NULL&&T->rchild==NULL){
if(r==NULL){
head=T;
}else{
r->rchild=T;
}
r=T;
}
CreateList(T->rchild);
}
void Print(LNode* head){
LNode *p=head;
while(p){
printf("%c",p->data);
p=p->rchild;
}
printf("\n");
}