在构建好二叉树后,需要通过一次遍历来给每个结点的parent赋值,关键代码如下:
void triBtee(BTNode *p,BTNode *q)//给各个结点的parent赋值
{
if(p == nullptr)
return;
p->parent = q;
q = p;
triBtee(p->left,q);
triBtee(p->right,q);
}
void printPath(BTNode *p){
while(p != nullptr){
cout<<p->value<<" ";
p = p->parent;
}
}
void allPath(BTNode *p){
if(p == nullptr)
return;
printPath(p);
cout<<endl;
allPath(p->left);
allPath(p->right);
}
完整代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct BTNode{
int value;
BTNode *parent;
BTNode *left;
BTNode *right;
}BTNode;
void addBTNode(BTNode *&myBT,int val);
void createBT(BTNode *&BT,int arr[],int n);
void triBtee(BTNode *p,BTNode *q);//给各个结点的parent赋值,p当前结点,q父结点
void printPath(BTNode *p);
void allPath(BTNode *p);
int main(){
BTNode *myBT = nullptr;
int arr[] = {314,426,12,78,143,8,21,14,9};
createBT(myBT,arr,sizeof(arr)/sizeof(arr[0]));
triBtee(myBT,nullptr);
allPath(myBT);
return 0;
}
void triBtee(BTNode *p,BTNode *q)//给各个结点的parent赋值
{
if(p == nullptr)
return;
p->parent = q;
q = p;
triBtee(p->left,q);
triBtee(p->right,q);
}
void printPath(BTNode *p){
while(p != nullptr){
cout<<p->value<<" ";
p = p->parent;
}
}
void allPath(BTNode *p){
if(p == nullptr)
return;
printPath(p);
cout<<endl;
allPath(p->left);
allPath(p->right);
}
void createBT(BTNode *&BT,int arr[],int n){
BT = nullptr;
for(int i=0;i<n;i++)
addBTNode(BT,arr[i]);
}
void addBTNode(BTNode *&myBT,int val){
if(myBT == nullptr){
myBT = new BTNode();
myBT->value = val;
myBT->left = myBT->right = nullptr;
return;
}
if(val == myBT->value){
return;
}
else if(val < myBT->value){
addBTNode(myBT->left,val);
}
else{
addBTNode(myBT->right,val);
}
}
运行结果如下: