求路徑(二叉樹)
阿新 • • 發佈:2019-02-06
1、題目:
Problem Description
假設有一棵二叉樹,其結點的值是字元型,該二叉樹採用二叉連結串列儲存方式表示。輸入其擴充套件二叉樹的前序遍歷序列,用於建立該二叉樹,並且假設p所指結點為一給定的結點x。現要求求出根結點到p所指結點x之間的路徑。我們假設這棵二叉樹不為空樹。Input
第一行為一個整數n,表示有n組測試例項。每組測試例項佔兩行:
第一行為一字串,表示一棵擴充套件二叉樹的前序遍歷序列;
第二行為一字元,表示給定的結點x。
Output
輸出根結點到結點x的路徑。Sample Input
2 AB#D##C## D ABD##E##C#F## F
Sample Output
A->B->D A->C->F
2.參考程式碼:
#include <iostream> #include <stack> using namespace std; struct BiNode{ char data; BiNode* lchild,* rchild,* fa; }; //加一個指向父節點的指標 BiNode* Creat(BiNode* root){ char ch; cin>>ch; if(ch=='#') root=NULL; else{ root=new BiNode; root->data=ch; root->fa=NULL; ///初始化指向父節點的指標為空 root->lchild=Creat(root->lchild); ///建立左孩子 if(root->lchild) ///如果左孩子不為空 root->lchild->fa=root; ///記下左孩子的父親 root->rchild=Creat(root->rchild); ///右孩子同理 if(root->rchild) root->rchild->fa=root; } return root; } stack<char> st; ///用一個棧來儲存路徑 BiNode* tmp; ///工作指標 void Query(BiNode* root,char x){ if(root==NULL) return ; else{ if(root->data==x) ///如果工作指標找到所給結點 { tmp=root; ///記下該節點 return ; } Query(root->lchild,x); Query(root->rchild,x); } } int main() { char x; int n; cin>>n; while(n--) { BiNode* root=Creat(NULL); cin>>x; Query(root,x); while(tmp->fa){ st.push(tmp->data); ///結點入棧 tmp=tmp->fa; ///指標下移 } st.push(root->data); ///根節點入棧 bool flg=false; while(!st.empty()){ if(flg) cout<<"->"; cout<<st.top(); st.pop(); flg=true; } cout<<endl; } return 0; }