本文是數據結構基礎系列(6):樹和2叉樹中第10課時2叉樹的遍歷的例程。
【利用2叉樹遍歷思想解決問題】(請利用2叉樹算法庫)
假定2叉樹采取2叉鏈存儲結構存儲,分別實現以下算法,并在程序中完成測試:
(1)計算2叉樹節點個數;
(2)輸出所有葉子節點;
(3)求2叉樹b的葉子節點個數
(4)設計1個算法Level(b,x,h),返回2叉鏈b中data值為x的節點的層數。
(5)判斷2叉樹是不是類似(關于2叉樹t1和t2類似的判斷:①t1和t2都是空的2叉樹,類似;②t1和t2之1為空,另外一不為空,則不類似;③t1的左子樹和t2的左子樹是類似的,且t1的右子樹與t2的右子樹是類似的,則t1和t2類似。)
[參考解答](btreee.h見算法庫)
(1)計算2叉樹節點個數;
#include
(2)輸出所有葉子節點;
#include <stdio.h> #include "btree.h" void DispLeaf(BTNode *b) { if (b!=NULL) { if (b->lchild==NULL && b->rchild==NULL) printf("%c ",b->data); else { DispLeaf(b->lchild); DispLeaf(b->rchild); } } } int main() { BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("2叉樹中所有的葉子節點是: "); DispLeaf(b); printf(" "); DestroyBTNode(b); return 0; }
(3)求2叉樹b的葉子節點個數
#include <stdio.h> #include "btree.h" int LeafNodes(BTNode *b) //求2叉樹b的葉子節點個數 { int num1,num2; if (b==NULL) return 0; else if (b->lchild==NULL && b->rchild==NULL) return 1; else { num1=LeafNodes(b->lchild); num2=LeafNodes(b->rchild); return (num1+num2); } } int main() { BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("2叉樹b的葉子節點個數: %d ",LeafNodes(b)); DestroyBTNode(b); return 0; }
(4)設計1個算法Level(b,x,h),返回2叉鏈b中data值為x的節點的層數。
#include
(5)判斷2叉樹是不是類似(關于2叉樹t1和t2類似的判斷:①t1和t2都是空的2叉樹,類似;②t1和t2之1為空,另外一不為空,則不類似;③t1的左子樹和t2的左子樹是類似的,且t1的右子樹與t2的右子樹是類似的,則t1和t2類似。)
#include
注:用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創建的用于測試的2叉樹以下――
上一篇 iOS開發之3D Touch
下一篇 淺析lua異常捕獲處理機制