您的位置:首页 > 其它

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

2015-12-08 19:16 447 查看
#include "iostream"
using namespace std;

typedef char type;
struct bnode{
type data;
type parent;
bnode *lchild,*rchild;
};

class tree{
public:
tree();//初始化
~tree();
void create_tree(bnode *&T);//建立二叉树
void parent(bnode *&T,bnode *root);//求二叉树所有结点的父节点
bnode *pa(bnode *p,bnode *T);//求结点p的父节点
void path(bnode *p,bnode *root);//结点p到根节点的路径
void all_path(bnode *T,bnode *root);
private:
bool flags;
bnode *temp;
};

tree::tree()//初始化
{
temp = new bnode;
temp = NULL;
flags = true;
}

void tree::create_tree(bnode *&T)//建立二叉树
{
type x;
cin>>x;
if(x=='#')T=NULL;
else {
T = new bnode;
T->data = x;
T->parent='#';
create_tree(T->lchild);//建立左子树
create_tree(T->rchild);//建立右子树
}
}

bnode *tree::pa(bnode *p,bnode *T)
{
if(flags&&T)
{
if(T->lchild==p||T->rchild==p)//父节点找到,终止递归
{
flags = false;
temp = T;
}else{
pa(p,T->lchild);//在左子树中寻找
pa(p,T->rchild);//在右子树中寻找

}
}
return temp;
}

void tree::parent(bnode *&T,bnode *root)
{
if(T)
{
if(T->parent=='#')
{
if(pa(T,root))//如果父节点存在
{
T->parent = pa(T,root)->data;
temp = NULL;
}
}
//cout<<"Pannel point:"<<T->data<<",parent:"<<T->parent<<endl;
flags = true;
parent(T->lchild,root);
parent(T->rchild,root);

}

}

void tree::path(bnode *p,bnode *root)
{
cout<<"["<<p->data<<"->"<<root->data<<"]:";
cout<<p->data<<" ";
while(p->parent!='#')
{
p =pa(p,root);
temp = NULL;
flags = true;
cout<<p->data<<" ";
}
cout<<endl;
}

void tree::all_path(bnode *T,bnode* root)
{
if(T)
{
if(T!=root)path(T,root);
all_path(T->lchild,root);
all_path(T->rchild,root);
}
}
tree::~tree(){}

int main()
{
tree Tree;
bnode *T;
cout<<"Create Tree['#'表示空节点]:"<<endl;
cout<<"Tree:";
Tree.create_tree(T);
cout<<"Tree finished!"<<endl;
Tree.parent(T,T);
cout<<"Path:"<<endl;
Tree.all_path(T,T);
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: