题目大意:
给出一个二叉树依次删除叶子结点的顺序,求出次二叉树的线序遍历
分析,主要是根据给出的删除叶子结点的顺序建立二叉树,题目有给出:
1.根节点左边的元素都比其小
2.根节点右边的元素都比其大
根据此可写出递归与非递归的程序
非递归:
View Code
include<iostream> #include<string> #include<cstring> using namespace std; typedef struct BiTree { char data; struct BiTree *lchild,*rchild; }BiTree; BiTree *CreateBiTree(char ch) { BiTree *leaf=new BiTree[sizeof(BiTree)]; leaf->data=ch; leaf->lchild=NULL; leaf->rchild=NULL; return leaf; } BiTree *InsertBiTree(char ch,BiTree *T) { BiTree *leaf=T; if(T==NULL) { T=CreateBiTree(ch); return T; } while(leaf) { if(leaf->data>ch) { if(leaf->lchild==NULL) { leaf->lchild=CreateBiTree(ch); break; } else leaf=leaf->lchild; } else if(leaf->data<ch) { if(leaf->rchild==NULL) { leaf->rchild=CreateBiTree(ch); break; } else leaf=leaf->rchild; } } return T; } void Preorder(BiTree *T) { if(T) { cout<<T->data; Preorder(T->lchild); Preorder(T->rchild); } } int main() { string str,s; int i,len; while(1) { str.erase(); BiTree *Root=NULL; while(cin>>s&&s!="*"&&s!="$") str+=s; len=str.length(); for(i=len-1;i>=0;i--) Root=InsertBiTree(str[i],Root); Preorder(Root); cout<<endl; if(s=="$") break; Root=NULL; str.erase(); } return 0; }
递归:
View Code
BiTree *InsertBiTree(char ch,BiTree *T) { if(T==NULL) { T=new BiTree [sizeof(BiTree)]; T->data=ch; T->lchild=NULL; T->rchild=NULL; return T; } if(T->data>ch) { if(T->lchild==NULL) { T->lchild=new BiTree [sizeof(BiTree)]; T->lchild->data=ch; T->lchild->lchild=NULL; T->lchild->rchild=NULL; return T; } else T->lchild=InsertBiTree(ch,T->lchild); } else { if(T->rchild==NULL) { T->rchild=new BiTree [sizeof(BiTree)]; T->rchild->data=ch; T->rchild->lchild=NULL; T->rchild->rchild=NULL; return T; } else T->rchild=InsertBiTree(ch,T->rchild); } return T; }