上週二叉樹的實驗報告拖到今天才勉強完成,說明對二叉樹的掌握還不是很透徹,在遞迴演算法上沒怎麼弄清楚,下面記錄寫出的幾個二叉樹的基本操作:
1.構建二叉樹
2.求二叉樹的葉子數
3.求二叉樹的深度
這裡採用的是二叉樹的鏈式儲存:
typedef struct bitnodebitnode ,*bitree;
二叉樹的構建主要思路採用遞迴思想(求葉子數和求深度都用到了遞迴的思想):如果輸入的不是標記符,則開始構建左子樹和右子樹,否則就將該結點data值記為標記符
int createbitree(bitree *t)
(*t)->data = ch;
}else
printf("\t\t\t\t\t(*t)->data = ch:");
(*t)->data = ch; //生成根節點
printf(" lchild:");
createbitree(&(*t)->lchild); //生成左子樹
printf("\t\t\t\t\t rchild:");
createbitree(&(*t)->rchild); //生成右子樹
}return ok;
}//建立二叉樹
構建二叉樹時需要注意的地方:
一開始寫成了
if(ch == 'z')
寫了乙個野指標,沒有為其分配空間,導致給二叉樹賦值的時候非正常退出,應為:
if(ch == 'z')
(*t)->data = ch;
}
計算葉子數思想:判斷該結點data值是否是標記符,如果是則返回0,如果不是則判斷左右子樹是否均為空,即判斷該結點是否為葉子結點,如果是則返回1,如果該節點左右子樹不為空,則分別計算左右子樹的葉子結點然後相加
int countbitreeleaf(bitree t)
else if((t->lchild->data == 'z') && (t->rchild->data == 'z'))
else
}//統計葉子結點的個數
計算樹的深度:
1、基準情形:空樹返回0;
2、遞迴形式:若不是空樹,比較它的左子樹深度和
右子樹深度,返回較大深度值加1,即:
return (rightdep>leftdep) ? rightdep+1 : leftdep+1;
int bitreedepth(bitree t)
else
}//求樹的深度
總結:二叉樹的操作很大程度上用到了遞迴的思想,對遞迴的用法和對指標的理解仍需要加強。
二叉樹基本操作
tree.h ifndef tree h define tree h include typedef int element 定義二叉樹 typedef struct nodetreenode void preorder treenode root 遞迴前序遍歷 void inorder treen...
二叉樹基本操作
一.二叉樹的定義 二.二叉樹的建立 定義一棵無資料的二叉樹 6 int left size 7 int right size 為了操作簡便,我們定義一棵不需要儲存資料的二叉樹,只要能儲存節點之間的邏輯關係就行,所以用兩個陣列來表示。left i 第i個節點的左子節點的序號 right i 第i個節點...
二叉樹基本操作
include include define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,char str 由str串建立二叉鏈 j ch str j btnode f...