1. 程式人生 > >二叉樹的建立、先序、中序以及後序遍歷

二叉樹的建立、先序、中序以及後序遍歷

二叉樹結點結構與雙鏈表結點結構式類似的,建立二叉樹時,需清楚其結點結構。至於先序遍歷、中序遍歷以及後序遍歷方法,採用思想都是遞迴的思想。

先建立如下二叉樹(黃色中的0,當輸入為0時,返回上一級,按先序方式建立二叉樹)


輸入順序為: 1234000500607900800

先序遍歷輸出為: 123456798

中序遍歷輸出為:     432516978

後序遍歷輸出為:     435298761

程式程式碼為:

// Bitree.cpp : 定義控制檯應用程式的入口點。
//

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

using namespace std;
typedef int type;

//定義數結點
typedef struct bNode
{
	type data;
	struct bNode *lchild;
	struct bNode *rchild;
}bNode,*bTree;

//先序建立二叉樹  
bTree CreateBitree(bTree &T)
{
	type ch;
	cin>>ch;
	if(0==ch)
	{
	 T=NULL;
	}
	else
	{
	   T=(bTree)malloc(sizeof(bNode));
	   if(NULL==T)
	   {
	     cout<<"申請記憶體失敗!"<<endl;
		 return NULL;
	   }
	   T->data=ch;
	   CreateBitree(T->lchild);
	   CreateBitree(T->rchild);
	}

   return T;
}

//先序遍歷
void PreOrder(bTree T)
{
	if(T)
	{
		cout<<T->data<<" ";
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}
//中序遍歷
void InOrder(bTree T)
{
	if(T)
	{
		InOrder(T->lchild);
		cout<<T->data<<" ";
		InOrder(T->rchild);
	}
}

//後序遍歷
void PostOrder(bTree T)
{
	   if(T)
	   {
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		cout<<T->data<<" ";
	   }
}
int _tmain(int argc, _TCHAR* argv[])
{
	bTree T;
	CreateBitree(T);

	PreOrder(T);
	cout<<endl;
	InOrder(T);
	cout<<endl;
	PostOrder(T);

	return 0;
}

程式輸出為:


計算樹的深度,為左子樹和右字樹的最大深度加1

//計算樹的深度
int TreeDepth(bTree T)
{
	if(!T)  return 0;
	int n1=TreeDepth(T->lchild);
	int n2=TreeDepth(T->rchild);

	return (n1>n2?n1:n2)+1;

}

結果為: