二分搜索树非递归节点计数删除

主要利用栈来代替递归算法,因为目的是计数和删除,所以建立就直接递归带过,然后稍微遍历一次,看是否建立成功。

放码子:

/*递归算法忒简单,一笔带过: int counter(tree *t) { if(NULL==tree) return 0; return counter(t->left)+counter(t->right); }*/ #include<iostream> #include<stack> #include<assert.h> using namespace std; #define nax 1000 typedef struct tr { int data; struct tr *left,*righ; }tree; tree *newroot; stack<tree*>pzjj; stack<tree*>pzj; tree* creat(tree *root,int val)//建立二分搜索树 { if(NULL==root) { newroot=new tree; newroot->data=val; newroot->left=NULL; newroot->righ=NULL; return newroot; } if(val<=root->data) root->left=creat(root->left,val); else root->righ=creat(root->righ,val); return root; } void lbr(tree* root)//利用栈非递归遍历二叉树 { while(NULL!=root || !pzjj.empty()) { if(NULL!=root) { pzjj.push(root); root=root->left; } else { root=pzjj.top(); pzjj.pop(); printf("%d ",root->data); root=root->righ; } } } void dele(tree* &root)//栈模拟删除二叉树,一般很少写,可有系统自动完成 { tree *tmp=NULL; assert(root);//删除前先行判断,以作对比 while(NULL!=root || !pzj.empty()) { if(NULL!=root)//**** { pzj.push(root); root=root->left; } else { root=pzj.top(); if(NULL!=root->righ && tmp!=root->righ) root=root->righ; else { root=tmp=pzj.top(); pzj.pop(); delete tmp; root=NULL;//root指向的地址已删除,要将root置空,防止****将非法地址入栈 } } } assert(root);//判断是否删除成功,若成功则会输出异常终止 } int counter(tree *root)//计数节点,这次来个地道的栈模拟 { tree *pzjay[nax],*tmp; int top=-1; int num=0; if(NULL!=root) pzjay[++top]=root; while(top>-1) { num++; tmp=pzjay[top]; top--; if(NULL!=tmp->left) pzjay[++top]=tmp->left; if(NULL!=tmp->righ) pzjay[++top]=tmp->righ; } return num; } int main() { int n; tree *tmp; tmp=NULL; while(EOF!=scanf("%d",&n))//回车+Ctrl+Z表示输入结束 tmp=creat(tmp,n); lbr(tmp);//遍历二叉树,验证是否创建成功 printf("/n"); printf("共有节点数 %d /n",counter(tmp)); dele(tmp); return false; }

唉,关于树的操作何其麻烦,简单的操作每每代码量都灰常可观。。。

你可能感兴趣的:(二分搜索树非递归节点计数删除)