二叉树结点结构与双链表结点结构式类似的,创建二叉树时,需清楚其结点结构。至于先序遍历、中序遍历以及后序遍历方法,采用思想都是递归的思想。
先创建如下二叉树(黄色中的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;
}
结果为: