1 #include "iostream" 2 using namespace std; 3 4 typedef char type; 5 struct bnode{ 6 type data; 7 type parent; 8 bnode *lchild,*rchild; 9 }; 10 11 class tree{ 12 public: 13 tree();//初始化 14 ~tree(); 15 void create_tree(bnode *&T);//建立二叉树 16 void parent(bnode *&T,bnode *root);//求二叉树所有结点的父节点 17 bnode *pa(bnode *p,bnode *T);//求结点p的父节点 18 void path(bnode *p,bnode *root);//结点p到根节点的路径 19 void all_path(bnode *T,bnode *root); 20 private: 21 bool flags; 22 bnode *temp; 23 }; 24 25 tree::tree()//初始化 26 { 27 temp = new bnode; 28 temp = NULL; 29 flags = true; 30 } 31 32 void tree::create_tree(bnode *&T)//建立二叉树 33 { 34 type x; 35 cin>>x; 36 if(x=='#')T=NULL; 37 else { 38 T = new bnode; 39 T->data = x; 40 T->parent='#'; 41 create_tree(T->lchild);//建立左子树 42 create_tree(T->rchild);//建立右子树 43 } 44 } 45 46 bnode *tree::pa(bnode *p,bnode *T) 47 { 48 if(flags&&T) 49 { 50 if(T->lchild==p||T->rchild==p)//父节点找到,终止递归 51 { 52 flags = false; 53 temp = T; 54 }else{ 55 pa(p,T->lchild);//在左子树中寻找 56 pa(p,T->rchild);//在右子树中寻找 57 58 } 59 } 60 return temp; 61 } 62 63 void tree::parent(bnode *&T,bnode *root) 64 { 65 if(T) 66 { 67 if(T->parent=='#') 68 { 69 if(pa(T,root))//如果父节点存在 70 { 71 T->parent = pa(T,root)->data; 72 temp = NULL; 73 } 74 } 75 //cout<<"Pannel point:"<<T->data<<",parent:"<<T->parent<<endl; 76 flags = true; 77 parent(T->lchild,root); 78 parent(T->rchild,root); 79 80 } 81 82 } 83 84 void tree::path(bnode *p,bnode *root) 85 { 86 cout<<"["<<p->data<<"->"<<root->data<<"]:"; 87 cout<<p->data<<" "; 88 while(p->parent!='#') 89 { 90 p =pa(p,root); 91 temp = NULL; 92 flags = true; 93 cout<<p->data<<" "; 94 } 95 cout<<endl; 96 } 97 98 void tree::all_path(bnode *T,bnode* root) 99 { 100 if(T) 101 { 102 if(T!=root)path(T,root); 103 all_path(T->lchild,root); 104 all_path(T->rchild,root); 105 } 106 } 107 tree::~tree(){} 108 109 int main() 110 { 111 tree Tree; 112 bnode *T; 113 cout<<"Create Tree['#'表示空节点]:"<<endl; 114 cout<<"Tree:"; 115 Tree.create_tree(T); 116 cout<<"Tree finished!"<<endl; 117 Tree.parent(T,T); 118 cout<<"Path:"<<endl; 119 Tree.all_path(T,T); 120 return 0; 121 }