1. 程式人生 > >二叉樹前序,中序,後序遍歷詳解

二叉樹前序,中序,後序遍歷詳解

只要是搞計算機的,對資料結構中二叉樹遍歷都不陌生,但是如果用到的機會不多那麼就會慢慢淡忘,溫故而之新才是最好的學習方式,現在就重新溫習一下這方面的知識。

首先我想先改變這幾個遍歷的名字(前根序遍歷,中根序遍歷,後根序遍歷);前中後本來就是相對於根結點來說的,少一個字會產生很多不必要的誤解。

 

1. 前根序遍歷:先遍歷根結點,然後遍歷左子樹,最後遍歷右子樹。

ABDHECFG

2.中根序遍歷:先遍歷左子樹,然後遍歷根結點,最後遍歷右子樹。

HDBEAFCG

3.後根序遍歷:先遍歷左子樹,然後遍歷右子樹,最後遍歷根節點。

HDEBFGCA

已知一棵二叉樹的前根序序列和中根序序列,構造該二叉樹的過程如下:
1. 根據前根序序列的第一個元素建立根結點;
2. 在中根序序列中找到該元素,確定根結點的左右子樹的中根序序列;
3. 在前根序序列中確定左右子樹的前根序序列;
4. 由左子樹的前根序序列和中根序序列建立左子樹;
5. 由右子樹的前根序序列和中根序序列建立右子樹。

已知一棵二叉樹的後根序序列和中根序序列,構造該二叉樹的過程如下:
1. 根據後根序序列的最後一個元素建立根結點;
2. 在中根序序列中找到該元素,確定根結點的左右子樹的中根序序列;
3. 在後根序序列中確定左右子樹的後根序序列;
4. 由左子樹的後根序序列和中根序序列建立左子樹;
5. 由右子樹的後根序序列和中根序序列建立右子樹。

根據前根序和中根序列印後根序程式碼:

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>

char preArray[] = "ABDHECFG";
char midArray[] = "HDBEAFCG";

typedef struct BinaryTree BiTree;
struct BinaryTree 
{
	char data;
	BiTree *LTree,*RTree;
};


void CreateBTree(BiTree **node,int mid_header,int mid_tail,int pre_header,int pre_tail)
{
	
	if(pre_header <= pre_tail || mid_header <= mid_tail)
	{
		BiTree* child;
		child = (BiTree*)malloc(sizeof(BiTree));
		child->data = preArray[pre_header];
		child->LTree = NULL;
		child->RTree = NULL;
		*node = child;
		int mid_num;
		for (mid_num = 0;preArray[pre_header] != midArray[mid_num];mid_num++);
		CreateBTree(&child->LTree,mid_header,mid_num-1,pre_header+1,pre_header+mid_num-mid_header);//create left tree
		CreateBTree(&child->RTree,mid_num+1,mid_tail,pre_tail-mid_tail+mid_num+1,pre_tail);
	}
	else
	{
		*node=NULL;
	}
	
}

void ShowBTree(BiTree* p)
{
	if (p)
	{
		ShowBTree(p->LTree);
		ShowBTree(p->RTree);
		printf("%c",p->data);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	BiTree *rootNode = NULL;
	rootNode = (BiTree*)malloc(sizeof(BiTree));
	rootNode->data = preArray[0];
	rootNode->LTree = NULL;
	rootNode->RTree = NULL;
	int mid_num = 0;
	for (mid_num = 0;preArray[0] != midArray[mid_num]; mid_num++);
	CreateBTree(&rootNode->LTree,0,mid_num-1,1,mid_num);//create left tree
	CreateBTree(&rootNode->RTree,mid_num+1,strlen(midArray)-1,mid_num+1,strlen(preArray)-1);//create right tree
	
	ShowBTree(rootNode);
	system("pause");
	return 0;
}