二叉树
1. 求二叉树高度
二叉树高度递归算法
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("%d\n", GetHeight(BT));
return 0;
}
int GetHeight( BinTree BT )
{
int H=0,n=0,m=0;
if(BT==NULL) return 0;
else {
m=GetHeight(BT->Left);
n=GetHeight(BT->Right);
if(m>n) return m+1;
else return n+1;
}
}
2.二叉树遍历
int GetHeight( BinTree BT )//求二叉树深度。层序遍历要用到深度
{
int n=0,m=0;
if(BT==NULL) return 0;
else {
m=GetHeight(BT->Left);
n=GetHeight(BT->Right);
if(m>n) return m+1;
else return n+1;
}
}
void InorderTraversal( BinTree BT )//中序遍历
{
if(BT)//如果不为空
{
InorderTraversal(BT->Left);//递归遍历左子树若为空则退出
printf(" %c",BT->Data);//输出
InorderTraversal(BT->Right);//右子树,前序遍历和中序遍历也是如此
}
}
void PreorderTraversal( BinTree BT )
{
if(BT)
{
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
void PostorderTraversal( BinTree BT ){
if(BT)
{
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
}
void printLevel(BinTree BT, int level)
{
if(BT)
{
if(level==1){
printf(" %c",BT->Data);
}
else
{
printLevel(BT->Left,level-1);//总共递归level次,到达当前要输出的层数,level=1,然后是输出
printLevel(BT->Right,level-1);
}
}
}
void LevelorderTraversal( BinTree BT )//层序遍历
{
int H=GetHeight(BT);//先求出深度
for(int i=1;i<=H;i++)
{
printLevel(BT,i);//输出第i层
}
}
3.先序输出叶结点
void PreorderPrintLeaves( BinTree BT )
{
if(BT)
{
if(!BT->Left&&!BT->Right){ //判断如果左右结点都为空,则为叶节点,输出。
printf(" %c",BT->Data);
}
PreorderPrintLeaves(BT->Left);
PreorderPrintLeaves(BT->Right);
}
}
递归总是那么高大上。
4.根据后序和中序遍历求前序
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
void getP(int po[],int in[],int n)
{
if(n>0)
{
int root=po[n-1];
int i;
for(i=0;i<n;i++)
{
if(in[i]==root)
break;
}
cout<<" "<<root;
getP(po,in,i);
getP(po+i,in+i+1,n-i-1);
}
}
int main ()
{
int po[50],in[50];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>po[i];
}
for(int i=0;i<n;i++)
{
cin>>in[i];
}
cout <<"Preorder:";
getP(po,in,n);
return 0;
}