*
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 ;//二叉樹類型
void Inorder(BinTree T
{
if(T)
{
Inorder(T
Visit(T
Inorder(T
}
}
解
(
若為空樹
若只有根結點
否則
(
若為空樹
若只有根結點
否則
typedef char DataType;//定義DataType類型
typedef struct node{
DataType data;
struct node *lchild
}BinTNode; //結點類型
typedef BinTNode *BinTree ;//二叉樹類型
int Node(BinTree T)
{//算結點數
if(T)
if (T
return
else return Node(T
else return
}
int Leaf(BinTree T)
{ //算葉子數
if(T)
if (T
return
else return Leaf(T
else return
}
解
(
當為空樹時
當只有一個結點時
其他情況
int Height(BinTree T)
{
int hl
if(T)
{//非空樹
if(t
return
else
{
hl=height(t
hr=height(t
if (hl>=hr)
return hl+
else return h
}
}
else return
}
(
#define M
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<n[i])max=n[i];//取出最大值
Width(T
i
Width(T
}
return max;
}//算法結束
答
要交換各結點的左右子樹
void ChangeBinTree(BinTree *T)
{ //交換子樹
if(*T)
{ //這裡以指針為參數使得交換在實參的結點上進行後序遍歷
BinTree temp;
ChangeBinTree(&(*T)
ChangeBinTree(&(*T)
temp=(*T)
(*T)
(*T)
}
}
解
因為調用函數只能進行值傳遞
void CopyTree(BinTree root
{ //拷貝二叉樹
if(root)//如果結點非空
{ //按前序序列拷貝
*newroot=(BinTNode *)malloc(sizeof(BinTNode));//生成新結點
(*newroot)
CopyTree(root
CopyTree(root
}
else //如果結點為空
*newroot=NULL;//將結點置空
}
解
根據上幾題的算法可以得出本題的算法如下
#define M
BinTree SearchBTree(BinTree *T
{//以前序遍歷算法查找值為x的結點
if(*T)
{
if((*T)
SearchBTree(&(*T)
SearchBTree(&(*T)
}
}
int InLevel(BinTree T
{
int static l=
if(T)
{
if(l==
{
l++;//第
if(T
if(T
l++;//若根有子樹
}
else
{ //訪問子樹結點
if(T
if(T
l++;//若該結點有子樹
else return
}
InLevel(T
InLevel(T
}
}
解
以向量為存儲結構的完全二叉樹
typedef char DataType;//設結點數據類型為char
#define M
typedef DataType BinTree[M];
void Preorder(BinTree T)
{ //前序遍歷算法
int n=T[
int<
From:http://tw.wingwit.com/Article/program/sjjg/201311/23582.html