數據結構18——建立二叉樹的二叉鏈表(嚴6.65)

Description

已知一棵二叉樹的前序序列和中序序列分別存於兩個一維數組中,試編寫算法建立該二叉樹的二叉鏈表。

Input

分兩行分別輸入一棵二叉樹的前序序列和中序序列。

Output

輸出該二叉樹的後序序列。

  • Sample Input 
    ABDFGCEH
    BFDGACEH
  • Sample Output

    FGDBHECA

  • #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct BTNode{
    	char data;
    	struct BTNode *lchild;
    	struct BTNode *rchild;
    }BTNode;
    
    char pre[100], mid[100];
    int len;
    
    void init(){
    	int i;
    	char s;
    	for(i = 0; i < 100; i++){
    		pre[i] = '#';
    		mid[i] = '#';
    	}
    	i = 0;
    	while(scanf("%c",&s) && s!='\n'){
    		pre[i] = s;
    		i++;
    	}
    	i = 0;
    	while(scanf("%c",&s) && s!='\n'){
    		mid[i] = s;
    		i++;
    	}
    	i = 0;
        while(pre[i]!='#'){
        	i++;
        }
        len = i;
    }
    
    BTNode *CreateNode(int pre_start, int pre_end, int mid_start, int mid_end){
    	int i, LLen,RLen;
    	BTNode *root = (BTNode*)malloc(sizeof(BTNode));
    	root->data = pre[pre_start];
    	root->lchild = NULL;
    	root->rchild = NULL;
    	i = mid_start;
    	while(root->data != mid[i])
    	    i++;
    	LLen = i - mid_start;
    	RLen = mid_end - i;
    	if(LLen){
    		root->lchild = CreateNode(pre_start+1, pre_start+LLen, mid_start, i-1);
    	}
    	if(RLen){
    		root->rchild = CreateNode(pre_start+LLen+1, pre_end, i+1,mid_end);
    	}
    	return root;
    }
    
    void PrintfTree(BTNode *root){
    	if(root->lchild)
    	     PrintfTree(root->lchild);
    	if(root->rchild)
    	     PrintfTree(root->rchild);
    	printf("%c",root->data);
    }
    
    int main(){
    	BTNode *root = (BTNode*)malloc(sizeof(BTNode));
    	init();
    	root = CreateNode(0 , len-1, 0, len-1);
    	PrintfTree(root);
    	return 0;
    }
    題解:先序和中序可確定唯一二叉樹,後序和中序可確定唯一二叉樹,先序和後序不可確定唯一二叉樹。
  • 先序的第一個元素A及根節點,找到該元素對應在中序序列中的A1,A1左邊即爲根節點左子樹上的全部元素,A1右邊即爲根節點右子樹上的全部元素。以此類推,找出所有根節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章