1. 程式人生 > >二叉樹的建立和遍歷(遞歸建樹&層序遍歷建樹)

二叉樹的建立和遍歷(遞歸建樹&層序遍歷建樹)

str use namespace lib empty tof troy 輸入 turn

#include<stdio.h>
#include <cstdlib>
#include <iostream>
#include <stack>
#include<queue>
using namespace std;

//二叉樹定義
typedef char ElementType;
typedef struct Node *Position;
typedef Position BinTree;
struct Node
{
ElementType data;
BinTree Left;
BinTree Right;
} BiTreeNode, *BiTree;


//遞歸的建立一棵二叉樹
//輸入為二叉樹的先序序列
void CreateBinTree(BinTree &T)
{
ElementType data;
data = getchar();
if(data == ‘#‘)
T = NULL;
else
{
T = new Node;
T->data = data;
CreateBinTree(T->Left);
CreateBinTree(T->Right);
}
}
void CreatBinTree_2(BinTree &rt,int n)///層序遍歷建樹
{
char root[2];
scanf("%s",root);
rt=new Node;
rt->data=root[0];
for(int i=2; i<=n; i++)
{
BinTree T=rt;
char tmp[2];
int num=0,a[16];
scanf("%s",tmp);
int ii=i;
while(ii)
{
a[num++]=ii%2;
ii/=2;
}
BinTree node=new Node;
node->data=tmp[0];
node->Right=NULL;
node->Left=NULL;
for(int j=num-2; j>0; j--)
if(a[j])T=T->Right;
else T=T->Left;
if(a[0])T->Right=node;
else T->Left=node;
}
}
int Nodenum(BinTree root)//二叉樹節點數目
{
if(root == NULL) return 0;
else return 1+Nodenum(root->Left)+Nodenum(root->Right);
}
//遞歸銷毀一棵二叉樹
void destroyBinTree(BinTree &T)
{
if(T)
{
destroyBinTree(T->Left);
destroyBinTree(T->Right);
delete T;
T = NULL;
}
}

//遞歸先序遍歷二叉樹
void preOrderTraverse(const BinTree &T)
{
if(T)
{
// cout<<T->data<<" ";//輸出根節點值
printf("%c ",T->data);
preOrderTraverse(T->Left);//遍歷左子樹
preOrderTraverse(T->Right);//遍歷右子樹
}
}

//遞歸中序遍歷二叉樹
void inOrderTraverse(const BinTree &T)
{
if(T)
{
inOrderTraverse(T->Left);//遍歷左子樹
// cout<<T->data<<" ";//輸出根節點值
printf("%c ",T->data);
inOrderTraverse(T->Right);//遍歷右子樹
}
}

//遞歸後序遍歷二叉樹
void postOrderTraverse(const BinTree &T)
{
if(T)
{
postOrderTraverse(T->Left);//遍歷左子樹
postOrderTraverse(T->Right);//遍歷右子樹
printf("%c ",T->data);
// cout<<T->data<<" ";//輸出根節點值
}
}

//遞歸求樹的深度
int depthOfBinTree(const BinTree &T)
{
int ldepth;
int rdepth;

if(T==NULL)//空樹
return 0;
ldepth = depthOfBinTree(T->Left);
rdepth = depthOfBinTree(T->Right);

return (ldepth>rdepth)?(ldepth+1):(rdepth+1);
}

//遞歸求二叉樹的葉子結點個數
int leafCountOfBinTree(const BinTree &T)
{
if(T==NULL)
return 0;
if(T->Left==NULL && T->Right==NULL)
return 1;
return leafCountOfBinTree(T->Left) + leafCountOfBinTree(T->Right);
}

void exchangeChild(BinTree &T)///交換左右子樹
{
if(T)
{
BinTree temp = NULL;

if(T->Left ||T->Right)
{
temp = T->Left;
T->Left = T->Right;
T->Right = temp;
exchangeChild(T->Left);
exchangeChild(T->Right);
}
}
}
void LevelOrderTraverse(BinTree T)///層序遍歷
{
//Visit是對節點操作的應用函數,
//在這裏,對每個數據元素調用函數Visit,也即是遍歷了該節點
queue<BinTree>q;
BinTree p;
if(T)
{
q.push(T);
while(!q.empty())
{
p=q.front();
q.pop();
printf("%c ",p->data);
if(p->Left!=NULL) q.push(p->Left);
if(p->Right!=NULL) q.push(p->Right);
}
printf("\n");
}
}
int main()
{
BinTree T = NULL;

CreateBinTree(T);//建立二叉樹 AB#D##CE###

printf("先序遍歷: "); //先序遍歷
preOrderTraverse(T);
printf("\n");

printf("中序遍歷: ");//中序遍歷
inOrderTraverse(T);
printf("\n");

printf("後序遍歷: ");//後序遍歷
postOrderTraverse(T);
printf("\n");

printf("層序遍歷: ");
LevelOrderTraverse(T);

printf("交換左右子樹: \n");
exchangeChild(T);

printf("先序遍歷: "); //先序遍歷
preOrderTraverse(T);
printf("\n");

printf("中序遍歷: ");//中序遍歷
inOrderTraverse(T);
printf("\n");

printf("後序遍歷: ");//後序遍歷
postOrderTraverse(T);
printf("\n");

printf("層序遍歷: ");
LevelOrderTraverse(T);

printf("深度: %d\n",depthOfBinTree(T));//樹的高度

printf("葉子結點數: %d\n",leafCountOfBinTree(T));//葉子結點數

printf("總結點數量: %d\n",Nodenum(T));
destroyBinTree(T);//銷毀二叉樹,釋放空間

///================================================================

int n;
scanf("%d",&n);
BinTree TT=NULL;
CreatBinTree_2(TT,n);

printf("先序遍歷: "); //先序遍歷
preOrderTraverse(TT);
printf("\n");

printf("中序遍歷: ");//中序遍歷
inOrderTraverse(TT);
printf("\n");

printf("後序遍歷: ");//後序遍歷
postOrderTraverse(TT);
printf("\n");


printf("深度: %d\n",depthOfBinTree(TT));//樹的高度

printf("葉子結點數: %d\n",leafCountOfBinTree(TT));//葉子結點數

printf("總結點數量: %d\n",Nodenum(TT));
destroyBinTree(TT);//銷毀二叉樹,釋放空間
system("PAUSE");
return EXIT_SUCCESS;
}

二叉樹的建立和遍歷(遞歸建樹&層序遍歷建樹)