(三)二元尋找樹轉換雙向鏈表

來源:互聯網
上載者:User

題意:不引入新節點,只允許指標操作,實現二元尋找樹轉換為相應雙向鏈表。

    10

   /    /

  6    14

 / /    /  /

4  8 12 16

轉換成雙向鏈表

4=6=8=10=12=14=16

 

 

分析:

方法0:轉換後的雙向鏈表正好為原樹的中序遍曆,所以引入一個新指標遞迴遍曆即可。

方法1:從10節點看,它的前趨、後繼分別是左子樹的最右節點與右子樹的最左節點,所以找到前趨與後繼儲存,遞迴實現即可。

 

 

代碼中驗證Btree建立成功分別用先序、中序與後序來遍曆。然後又用到了Btree拷貝方法驗證兩種tree2list方法。

C++實現:

#include <iostream><br />#include <stack><br />using namespace std;</p><p>struct btree{<br /> btree(int v):val(v), l(NULL), r(NULL){}<br /> int val;<br /> btree *l, *r;<br />};</p><p>void preorder(btree* head){<br /> btree* tmp = head;<br /> stack<btree*> s;<br /> while(!s.empty() || tmp!=NULL){<br /> while(tmp!=NULL){<br /> s.push(tmp);<br /> cout << s.top()->val << "/t";<br /> tmp=tmp->l;<br /> }<br /> tmp=s.top()->r;<br /> s.pop();<br /> }<br />}<br />void inorder(btree* head){<br /> btree* tmp = head;<br /> stack<btree*> s;<br /> while(!s.empty() || tmp!=NULL){<br /> while(tmp!=NULL){<br /> s.push(tmp);<br /> tmp=tmp->l;<br /> }<br /> tmp=s.top()->r;<br /> cout << s.top()->val << "/t";<br /> s.pop();<br /> }<br />}</p><p>void postorder(btree* head){<br /> btree* tmp = head;<br /> stack<btree*> s;<br /> stack<bool> f;<br /> while(!s.empty() || tmp!=NULL){<br /> while(tmp!=NULL){<br /> s.push(tmp);<br /> f.push(false);<br /> tmp=tmp->l;<br /> }<br /> if(f.top()==false){<br /> tmp=s.top()->r;<br /> f.pop();<br /> f.push(true);<br /> }else{<br /> cout << s.top()->val << "/t";<br /> s.pop();<br /> f.pop();<br /> }<br /> }<br />}</p><p>void walklist(btree* head){<br /> btree* tmp=head;<br /> while(tmp!=NULL){<br /> cout << tmp->val << "/t";<br /> tmp=tmp->r;<br /> }<br />}</p><p>//way0: inorder travel<br />void tree2list(btree* bt,btree*& list)<br />{<br /> if(bt->l!=NULL)<br /> tree2list(bt->l, list);<br /> if(list!=NULL){<br /> list->r = bt;<br /> bt->l = list;<br /> list = bt;<br /> }else{<br /> list=bt;<br /> }<br /> if(bt->r)<br /> tree2list(bt->r, list);<br />}</p><p>//way1: find the pre and post<br />btree* getRight(btree* bt){<br /> if(bt==NULL) return bt;<br /> while(bt->r!=NULL){<br /> bt = bt->r;<br /> }<br /> return bt;<br />}<br />btree* getLeft(btree* bt){<br /> if(bt==NULL) return bt;<br /> while(bt->l!=NULL){<br /> bt = bt->l;<br /> }<br /> return bt;<br />}<br />void tree2list1(btree*& bt){<br /> btree *pre, *post;</p><p> if(bt==NULL) return;<br /> pre = getRight(bt->l);<br /> post = getLeft(bt->r);<br /> if(bt->l!=NULL) tree2list1(bt->l);<br /> if(bt->r!=NULL) tree2list1(bt->r);<br /> bt->l = pre;<br /> if(pre!=NULL) pre->r = bt;<br /> bt->r = post;<br /> if(post!=NULL) post->l = bt;<br />}</p><p>btree* treeCopy(btree* bt){<br /> if(bt==NULL) return bt;<br /> btree* tmp = new btree(bt->val);<br /> if(bt->l!=NULL) tmp->l = treeCopy(bt->l);<br /> if(bt->r!=NULL) tmp->r = treeCopy(bt->r);<br /> return tmp;<br />}</p><p>int main()<br />{<br /> /*creat tree*/<br /> btree *n1 = new btree(10);<br /> btree *n2 = new btree(6);<br /> btree *n3 = new btree(14);<br /> btree *n4 = new btree(4);<br /> btree *n5 = new btree(8);<br /> btree *n6 = new btree(12);<br /> btree *n7 = new btree(16);</p><p> //creat Btree<br /> n1->l = n2, n1->r = n3;<br /> n2->l = n4, n2->r = n5;<br /> n3->l = n6, n3->r = n7;<br /> btree *n8 = treeCopy(n1); </p><p> //travel Btree<br /> cout << "Preorder:/t";<br /> preorder(n1);<br /> cout << endl;<br /> cout << "Midorder:/t";<br /> inorder(n1);<br /> cout << endl;<br /> cout << "Postorder:/t";<br /> postorder(n1);<br /> cout << endl;</p><p> //Way0: Btree to list<br /> btree* list=NULL;<br /> tree2list(n1,list);<br /> list = n1;<br /> while(list!=NULL && list->l!=NULL)<br /> list=list->l;<br /> cout << "DoubleList:/t";<br /> walklist(list);<br /> cout << endl;</p><p> //Way1: Btree to list<br /> tree2list1(n8);<br /> list = n8;<br /> while(list!=NULL && list->l!=NULL)<br /> list=list->l;<br /> cout << "DoubleList1:/t";<br /> walklist(list);<br /> cout << endl;</p><p> return 0;<br />}<br />  

 

 

運行結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.