树的各种递归算法大集锦1
#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); }