写一个递归函数,销毁一棵二叉树
#include<iostream> using namespace std; template<typename T> struct BTNode { T data; BTNode<T> *lchild; BTNode<T> *rchild; }; template<typename T> static int clear(BTNode<T> *bt) //销毁二叉树 { if(bt) //根节点不为空 { clear(bt->lchild); //递归调用clear()函数销毁左子数 clear(bt->rchild);//递归调用clear()函数销毁右子树 cout<<"释放了指针"<<bt<<"所指向的空间"<<endl; delete bt;//释放当前的根节点 } return 0; //退出当层函数,执行下一语句 }
上面程序使用递归实现了二叉树的销毁。下面是一个简单的二叉树,看看它的销毁过程。
bt指向根节点A,不为空。递归调用clear(bt->lchild),bt指向B不为空,继续递归调用clear(bt->lchild),bt指向空。
下面伪代码 描述了具体的递归调用过程。
clear(bt) // 0 { if(bt) //0 根节点不为空 { clear(Lbt1)//1 调用 clear(bt->lchild); { if(Lbt1)//1 第一个左节点不为空 { clear(Lbt2)// 2 继续调用clear(bt->lchild); { if(Lbt2)//2 看图Lbt2为空 {} return 0; //跳到2的clear(bt->lchild);之后 } clear(Rbt2) //2 继续调用clear(bt->rchild); { if(Rbt2) {} return 0;//跳到2的clear(bt->rchild);之后 } cout<<"释放指针"<<Lbt1<<"所指向的空间"<<endl; //2 delete Lbt1; //2 } return 0; //1 结束跳到1的clear(bt->lchild);之后 } clear(Rbt1)//1 调用 clear(bt->rchild); { if(Rbt1)//RBt1为空 {} return 0;//1 结束跳到1的clear(bt->rchild);之后 } cout<<"释放指针"<<bt<<"所指向的空间"<<endl; delete bt } return 0;//0整个程序结束 }