5)二叉树[3]求所有结点到根节点的路径

  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 }

posted @ 2015-12-08 19:16  指间ゝ繁华初逝的格调  阅读(502)  评论(0编辑  收藏  举报