#include <stdlib.h> #include <conio.h> #include <stdio.h> #include <stdbool.h> struct BiTNode { int data; struct TreeNode *lchild,*rchild; }BiTNode, *BiTree; //輸出二叉樹的所有結點個數 int Put(BiTree b) { if(b==NULL) return 0; else return Put(b->lchild)+Put(b->rchild)+1; } //計算二叉樹中雙分支結點的個數 int Double(BiTree b) { if(b==NULL) return 0; //返回的樹的高度為0 if(b->lchild!=NULL&&b->rchild!=NULL) return Double(b->lchild)+Double(b->rchild)+1; else return Double(b->lchild)+Double(b->rchild); } //計算二叉樹中單分支結點的個數 int Single(BiTree b) { if(b==NULL) return 0; if((b->lchild!=NULL)&&(b->rchild==NULL)||(b->lchild==NULL)&&(b->rchild!=NULL)) return Single(b->lchild)+Single(b->rchild)+1; else return Single(b->lchild)+Single(b->rchild); } //輸出二叉樹中的所有葉子節點 void Putleaf(BiTree b) { if(b!=NULL) { if(b->lchild=NULL&&b->rchild=NULL) //若是葉子節點遞歸輸出 printf("%c",b->data); Putleaf(b->lchild);//其他結點 Putleaf(b->rchild); } } //輸出二叉樹中的所有雙分支結點 int Pdouble(BiTree b) { if(b!=NULL) { if(b->lchild!=NULL&&b->rchild!=NULL) //若是葉子節點遞歸輸出 printf("%c",b->data); Putleaf(b->lchild);//其他結點 Putleaf(b->rchild); } } //求二叉樹第k層結點個數 void Lnodenum((BiTree b,int h,int k,int &n) { //h表示b所指的結點層次,初值為1 if(b==NULL) return; else //處理非空樹 { if(h==k) n++; //當訪問的結點在第k層時n增1 else //若當前訪問的結點層次小於k,遞歸處理左右子樹 { Lnode(b->lchild+1,h+1,k,n); Lnode(b->rchild+1,h+1,k,n); } } } int n=0; //全局變量,用於記錄第k層結點的個數 void Lnodenum(BiTree b,int h,int k) { //h表示b所指的結點層次 if(b==NULL) return; else { if(h==k) n++; else if(h<k) { Lnode(b->lchild,h+1,k); Lnode(b->rchild,h+1,k); } } } //刪除二叉樹中以元結點值x為的根節點的子樹 void Del(BiTree b,Elemtype x) { //基於先序遍歷的遞歸算法,先找到值為x的結點p,然后調用DestoryBTree(p)刪除並釋放該子樹 if(b==NULL) return; if(b->data==x) { DestoryBTree(b); b = NULL; } else { Del(b->lchild,x); Del(b->rchlid,x); } } void DestoryBTree(BiTree &b) { //釋放二叉樹b中所有結點分配的空間 if(b!=NULL) { DestoryBTree(b->lchild); DestoryBTree(b->rchild); free(b); } }
//求先序遍歷序列中的第k(1<=k<=二叉樹中結點的個數)個結點的值 int i=1; //遍歷序號的全局變量 Elemtype Search(BiTree b,int k) { if(b==NULL) return '#'; if(i==k) return b->data; i++; ch = Search(b->lchild,k); if(ch!='#') return ch; ch = Search(b->rchild,k); return ch; } /* 設置一個全局變量記錄已訪問的結點的序號,其初值是根節點在先序序列中的序號,即1. 當二叉樹為空時,返回'#',當i==k時返回b->data, 當i!=k時遞歸的在左子樹中查找,若找到返回該值,否則繼續遞歸右子樹查找,並返回其結果 */ //判斷兩棵二叉樹是否相似的算法 bool Like(BiTree b1,BiTree b2) { bool like1,like2; if(b1==NULL&&b2==NULL) return true; else if((b1==NULL||b2==NULL) return false; else { like1 = Like(b1->lchild,b2->lchild); like2 = Like(b1->rchild,b2->rchild); return (like1&&like2); //返回like1,like2與運算的結果 } } //判斷一棵二叉樹b的左右子樹是否同構 bool Like(BiTree b1,BiTree b2) //判斷二叉樹b1,b2是否同構 { bool like1,like2; if(b1==NULL&&b2==NULL) return true; else if(b1==NULL||b2==NULL) return false; else { like1 = Like(b1->lchild,b2->lchild); like2 = Like(b1->rchild,b2->rchild); return (like1&&like2); } } bool LikeBiTree(BiTree b) //判斷二叉樹的左右子樹是否同構 { if(b==NUL) return true; else return Like(b->lchild,b->rchild); }