二
void Inorder(BinTree
if (T){
Inorder(T
Visit(T
Inorder(T
}
}
其中Visit是一個函數指針
void PrintNode(BinTree T)
{
printf(
}
為了驗證這個函數是否正確
typedef char DataType;//定義DataType類型
typedef struct node{
DataType data;
struct node *lchild
}BinTNode; //結點類型 typedef BinTNode *BinTree ;//二叉樹類型 #include
#include
void CreatBinTree(BinTree *T)//輸入序列是先序序列
{ //構造二叉鏈表
char ch;
if ((ch=getchar())==
*T=NULL;
else{ //讀入非空格
*T=(BinTNode *)malloc(sizeof(BinTNode));//生成結點
(*T)
CreatBinTree(&(*T)
CreatBinTree(&(*T)
}
}
//
void PrintNode(DataType x)
{ //題目要求的打印函數
printf(
}
//
void Inorder(BinTree T
{
if(T)
{
Inorder(T
Visit(T
Inorder(T
}
}
void main()
{ //現在開始測試啦 BinTree root; //定義一個根結點
CreatBinTree(&root); //建立二叉鏈表
printf(
Inorder(root
printf(
}
//運行時請輸入
解
完整程序如下所示
typedef struct node{
DataType data;
struct node *lchild
}BinTNode; //結點類型 typedef BinTNode *BinTree ;//二叉樹類型 #include
#include
void CreatBinTree(BinTree *T)
{ //構造二叉鏈表
char ch;
if ((ch=getchar())==
*T=NULL;
else{ //讀入非空格
*T=(BinTNode *)malloc(sizeof(BinTNode));//生成結點
(*T)
CreatBinTree(&(*T)
CreatBinTree(&(*T)
}
}//
{ //算結點數
int static nodes=
if(T)
{ //使用中序遍歷
Node(T
nodes++; //結點數加
Node(T
}
return nodes;
} int Leaf(BinTree T)
{ //算葉子數
int static leaves=
if(T)
{ //使用中序遍歷
Leaf(T
if(!(T
leaves++; //葉子數加
Leaf(T
}
return leaves;
}//算法結束
void main()
{ //測試程序
BinTree root;
CreatBinTree(&root);
int nodes=Node(root);
int leaves=Leaf(root);
printf(
}
解
#include
#include
#define M
int Height(BinTree T)//求樹的深度
{ //求深度算法由阮允准更正
int lhigh
if(T!=NULL)
{
lhigh=Height(T
rhigh=Height(T
high=(lhigh>rhigh?lhigh:rhigh)+
}
return high;
} int Width(BinTree T)
{
int static n[M];//向量存放各層結點數
int static i=
int static max=
if(T)
{
if(i==
{
n[i]++; //第
i++; //到第
if(T
n[i]++;
if(T
n[i]++;
}
else
{ //訪問子樹結點
i++; //下一層結點數
if(T
n[i]++;
if(T
n[i]++;
}
if(max Width(T->lchild);//遍歷左子樹 i--; //往上退一層 Width(T->rchild);//遍歷右子樹 } return max; }//算法結束 void main() { //測試程序 BinTree root; CreatBinTree (&root); printf("\nHeight of BinTree:%d",Height(root)); printf("\nWidth of BinTree:%d",Width(root)); } 6.25 以二叉鏈表為存儲結構, 寫一算法交換各結點的左右子樹。TW.WinGwiT.Com 要交換各結點的左右子樹,最方便的辦法是用後序遍歷算法,每訪問一個結點時把兩棵子樹的指針進行交換,最後一次訪問是交換根結點的子樹。 #include #include "bintree.h" void ChangeBinTree(BinTree *T) { //交換子樹 if(*T) { //這裡以指針為參數使得交換在實參的結點上進行 //後序遍歷 BinTree temp; ChangeBinTree(&(*T)->lchild); ChangeBinTree(&(*T)->rchild); temp=(*T)->lchild; (*T)->lchild=(*T)->rchild; (*T)->rchild=temp; } } void PrintNode(BinTree T) { //以前序序列打印結點數據 if(T) { printf("%c",T->data); PrintNode(T->lchild);
From:http://tw.wingwit.com/Article/program/sjjg/201311/23663.html