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:"< data<<",parent:"< parent< lchild,root); 78 parent(T->rchild,root); 79 80 } 81 82 } 83 84 void tree::path(bnode *p,bnode *root) 85 { 86 cout<<"["< data<<"->"< data<<"]:"; 87 cout< data<<" "; 88 while(p->parent!='#') 89 { 90 p =pa(p,root); 91 temp = NULL; 92 flags = true; 93 cout< data<<" "; 94 } 95 cout< 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['#'表示空节点]:"<