這道微軟面試題是我在多年以前參加微軟面試的時侯被問到的,當時沒有做出來。這些天在關注http://v_july_v.的部落格中微軟面試一百題,想再重新都做一遍。
問題描述:tree2list二叉樹轉雙向鍊錶
解決方案:很顯然是一道考察遞迴的問題,那麼既然要遞迴一顆二叉樹,無非也就常用的先序,中序和後序遍歷。現在看來我覺得用哪一種遍歷都可以實現。
下面我就以中序遍歷為基礎描述一下解決的思路,借助乙個輔助的資料結構來儲存頭尾指標。在乙個子樹的遍歷過程修改這個輔助的資料結構,同助修改二叉樹將父子結點之間的指向關係(**如下)。有不合適的地方,希望大家指正,多謝!
typedef struct autnode
}helpnode;
helpnode global;
helpnode mytree2list(bstreenode * root)
helpnode ltemp = mytree2list(root->m_pleft);
if(ltemp.head==null)
if(ltemp.tail==null)
else
helpnode rtemp = mytree2list(root->m_pright);
if(rtemp.tail==null)
if(rtemp.head==null)
else
global.head=ltemp.head;
global.tail=rtemp.tail;
if(global.head!=null && global.tail!=null)
cout<<"value of global is:"// 後序遍歷, 記著修改函式返回值,頭尾結點的left 和right分別置null;
helpnode mytree2list2(bstreenode * root)
helpnode global2;
helpnode ltemp = mytree2list2(root->m_pleft);
helpnode rtemp = mytree2list2(root->m_pright);
if((ltemp.tail==null) && (rtemp.head==null))
else if ((ltemp.tail!=null) && (rtemp.head!=null))
else if (ltemp.tail==null && rtemp.head!=null)
else if(ltemp.tail!=null && rtemp.head==null)
return global2;
}
二叉樹轉雙向鍊錶
include using namespace std 樹節點 struct node typedef struct node link 構造樹 void insert tree link h,int t if h val t insert tree h left,t else insert tre...
二叉樹轉雙向鍊錶
1.a 遞迴轉化左子樹為雙向鍊錶 1.b 找出根結點的前驅節點 是左子樹的最右的節點 1.c 將上一步找出的節點和根結點連線起來 2,如果右子樹不為null,處理右子樹 和上面的很類似 1.a 遞迴轉化右子樹為雙向鍊錶 1.b 找出根結點的後繼節點 是右子樹的最左的節點 1.c 將上一步找出的節點和...
二叉樹轉雙向鍊錶
這是一道挺有趣的題,其解題的思路主要還是二叉樹的中序遍歷 先建立乙個頭結點list,然後通過中序遍歷二叉樹,把結點串起來即可!注意點 1 需要有乙個指標來指向上乙個已遍歷過的結點 2 如果不建立頭結點,在後面遍歷判斷時比較麻煩 include using namespace std struct n...