#include <iostream> #include <string.h> #include <stack> #include <queue> using namespace std; typedef struct node{ char data; struct node *lchild; struct node *rchild; }Node; void CreateTree(Node * &T){ char ch; cin>>ch; if(ch=='#') T=NULL; else{ T=new Node; T->data=ch; CreateTree (T->lchild); CreateTree (T->rchild); } } // 递归先序 void PreOrderR(Node *T){ if(T) { cout<<T->data<<" "; PreOrderR(T->lchild); PreOrderR(T->rchild); } } // 递归中序 void InOrderR(Node *T){ if(T){ InOrderR(T->lchild); cout<<T->data<<" "; InOrderR(T->rchild); } } // 递归后序 void PostOrderR(Node *T){ if(T){ PostOrderR(T->lchild); PostOrderR(T->rchild); cout<<T->data<<" "; } } // 循环先序 void PreOrderL(Node *T){ stack <Node *> S; Node *p=T; while(p || !S.empty()){ while(p){ cout<<p->data<<" "; S.push(p); p=p->lchild; } if(!S.empty()){ p=S.top(); S.pop(); p=p->rchild; } } } // 循环中序 void InOrderL(Node *T){ stack <Node *> S; Node *p=T; while(p || !S.empty()){ if(p){ S.push(p); p=p->lchild; } else{ p=S.top(); cout<<p->data<<" "; S.pop(); p=p->rchild; } } } // 循环后续 void PostOrderL(Node *T){ stack <Node *> S; // 栈里面存放树的结点指针即可,而非整个结点数据 Node *p=T,*r=NULL; while(p || !S.empty()){ if(p){ S.push(p); p=p->lchild; } else{ p=S.top(); if(p->rchild && p->rchild!=r){ p=p->rchild; S.push(p); p=p->lchild; } else{ S.pop(); cout<<p->data<<" "; r=p; p=NULL; } } } } // 层序遍历 void LevelOrder(Node *T){ queue <Node *> Q; Node *p; Q.push(T); // 根结点入队 while(!Q.empty()){ p=Q.front(); Q.pop(); cout<<p->data<<" "; if(p->lchild) Q.push(p->lchild); if(p->rchild) Q.push(p->rchild); } } // 递归求二叉树高度 int DepthR(Node *T){ int ldepth,rdepth; if(!T) return 0; // 空树,高度为0。也就是初值 ldepth=DepthR(T->lchild); rdepth=DepthR(T->rchild); return ldepth>rdepth ? ldepth+1:rdepth+1; } // 循环求二叉树高度 int DepthL(Node *T){ if(!T) return 0; int front=-1,rear=-1, last=0,level=0; queue <Node *> Q; Q.push(T); rear++; Node *p; while(front<rear){ p=Q.front(); front++; Q.pop(); if(p->lchild){ Q.push(p->lchild);rear++; } if(p->rchild){ Q.push(p->rchild);rear++; } if(front==rear){ // 主体类似层序遍历,前后不同 level++; last=rear; } } return level; } // 删除结点 void Del(Node * &T){ if(T){ Del(T->lchild); Del(T->rchild); free(T); T=NULL; } } // 删除以X为根的子树 void DelX(Node *T,char X){ queue <Node *> Q; Node *p; if(T){ if(T->data==X) {Del(T);return;} Q.push(T); while(!Q.empty()){ // 把X的左右子树先删除,区分左右 p=Q.front(); Q.pop(); if(p->lchild){ if(p->lchild->data==X) Del(p->lchild); else Q.push(p->lchild); } if(p->rchild){ if(p->rchild->data==X) Del(p->rchild); else Q.push(p->rchild); } } } } // 获得父节点 Node * GetParent(Node *T,char X){ if(T){ if(T->lchild) // 只有child存在的情况下,才能访问其数据域,否则出错 if(T->lchild->data==X) return T; if( T->rchild) if(T->rchild->data==X) return T; GetParent(T->lchild,X); GetParent(T->rchild,X); } } int main(){ Node *T; cout<<"先序建立二叉树,如 ABDG##H###CE#I##F## :"<<endl; CreateTree(T); cout<<"递归先序: "; PreOrderR(T); cout<<endl; cout<<"循环先序: "; PreOrderL(T); cout<<endl; cout<<"递归中序: "; InOrderR(T); cout<<endl; cout<<"循环中序: "; InOrderL(T); cout<<endl; cout<<"递归后序: "; PostOrderR(T); cout<<endl; cout<<"循环后序: "; PostOrderL(T); cout<<endl; cout<<"层序遍历: "; LevelOrder(T); cout<<endl; cout<<"DepthR:"<<DepthR(T)<<endl<<"DepthL:"<<DepthR(T)<<endl; Node *p=GetParent(T,'E'); cout<<"E的父节点:"<<p->data<<endl; DelX(T,'C'); cout<<"层序遍历: "; LevelOrder(T); cout<<endl; return 0; } #if 0 A / / / B C / / / / D # E F / / / G H # I # # / / / # # # # # # ABDG##H###CE#I##F## #endif