/*#include<iostream> #include<windows.h> using namespace std ; struct BTNode { char data ; BTNode *left ; BTNode *right ; BTNode () { left = NULL ; right = NULL ; } } ; int main () { cout <<"题目所给的二叉树用括号表示法后表示为:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) " <<endl; //输入一串括号表示法 ; cout <<"所给的二叉树的深度为 :"; //输出深度 ; cout <<endl; cout <<"所给的二叉树结点个数为 :" ; //输出个数 cout <<endl; cout <<"所给的二叉树的叶子结点个数为 :" <<endl; //叶子结点的个数 //先序遍历二叉树: //中序; //后序; //层次 ; cout <<"所给的二叉树当中的H 的所有祖先为:"<<endl; system ("pause ") ; } */ #include<iostream> #include<windows.h> #include<stack> using namespace std ; struct BiTNode{ char c ; BiTNode* left ; BiTNode* right ; } ; //char s[] = "a(b(c,d),e(f,g))"; char s[] = "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))" ; void CreateBTNode (BiTNode *&b , char *s ) { BiTNode *St[20] ,*p = NULL ; int top = -1 , k , j=0 ; char ch ; b = NULL ; ch = s[j] ; while( ch!='\0' ) { switch( ch ) { case '(' : top++ ; St[top] = p ; k=1 ; break ; case ')' : top-- ; break ; case ',' : k = 2 ; break ; default : p = new BiTNode ; p->c = ch ; p->left = p->right = NULL ; if(b == NULL) b = p ; else{ switch(k){ case 1:St[top]->left = p ;break ; case 2:St[top]->right = p ;break ; } } } j++; ch = s[j]; } } void priorder (BiTNode *p) { if(p != NULL){ cout <<p->c <<" "; priorder(p->left) ; priorder(p->right) ; } }//前序 void post (BiTNode *p) { if( p != NULL) { post (p->left) ; post (p->right) ; cout <<p->c <<" " ; } }//后序 void InOrder(BiTNode *t){ stack<BiTNode*> s; while(!s.empty() || t != NULL){ while(t != NULL){ s.push(t); t = t->left ; } if(!s.empty()){ t = s.top() ; s.pop() ; cout<<t->c<<" "; t = t->right; } } } //中序 int front=0,rear=1; void Levelorder(BiTNode *t){ BiTNode *q[100]; q[0]=t; while(front<rear){ if(q[front]){ cout<<q[front]->c<<" " ; q[rear++]=q[front]->left; q[rear++]=q[front]->right; front++; } else{ front++; } } } int u =0 ; int v =0 ; int height(BiTNode *p) { if (p==NULL) return 1; u=height(p->left); v=height(p->right); if (u>v) return (u+1) ; else return (v+1) ; } int i =0 ; int node_num (BiTNode *p) { if( p== NULL) return 0 ; u= node_num(p->left) ; v =node_num(p->right) ; i++ ; return i ; } int leaf_num(BiTNode *p) { if(!p) return 0; else if(!p->left && !p->right) return 1; else return leaf_num(p->left)+leaf_num(p->right); } int main(){ struct BiTNode *p; int len = sizeof(s); CreateBTNode(p,s); cout <<"题目所给的二叉树是 :A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"<<endl; cout <<"二叉树的深度是 : "<<height(p)<<endl; cout <<"二叉树结点的个数为 : "<<node_num(p)<<endl; cout <<"二叉树的叶子结点个数为 : "<<leaf_num(p)<<endl; cout <<"前序遍历输出 :"; priorder(p); cout <<endl; cout <<"中序遍历输出(非递归) :" ; InOrder(p) ; cout <<endl; cout<<"后序遍历输出 :" ; post (p) ; cout <<endl ; cout <<"层序遍历输出 :"; Levelorder(p) ; cout <<endl ; cout<<"结点H的祖先为 :A B E "<<endl; system ("pause") ; return 0; }
求祖先的办法:输出前序遍历和后序遍历,找到所求结点的位置,前序遍历在它之前,后序遍历在他之后,交集就是祖先
时间: 2024-10-05 05:04:56