树的各种递归算法大集锦
Posted 万事开头难
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的各种递归算法大集锦相关的知识,希望对你有一定的参考价值。
#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); } }
以上是关于树的各种递归算法大集锦的主要内容,如果未能解决你的问题,请参考以下文章
每日一题如何进行二叉树的各种遍历的非递归算法实现?简要讲述。