Tree2List二叉樹轉雙向鍊錶的實現

2021-06-17 20:58:28 字數 1287 閱讀 2393

這道微軟面試題是我在多年以前參加微軟面試的時侯被問到的,當時沒有做出來。這些天在關注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...