面試題27 二叉搜尋樹與雙向鍊錶轉換

2021-07-15 07:26:54 字數 2468 閱讀 8166

1.輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶,不能建立任何新的結點。只能調整樹中結點指標的指向。

例如: 下面的二叉搜尋樹和對應的雙向鍊錶。

分析:在二叉搜尋樹中,每個節點都有兩個指標,在雙向鍊錶中,也有兩個指標,在二叉搜尋樹種,做節點的值總是小於父節點的值,右節點的值總是大於父節點的值。為了使得構造的雙向鍊錶有序,原先指向左節點的指標調整為指向前乙個節點,原先指向右節點的指標指向鍊錶中的下乙個結點。而二叉搜尋樹的中序遍歷出來的序列是從小打到排序的。所以採用中序遍歷二叉樹。當遍歷到根節點的時候,如下圖:

當遍歷到根節點10 的時候,可以將樹看成三個部分,根節點為6的左子樹的部分和根節點為14 的右子樹,按要求,值為10 的節點將和左子樹的最大的乙個節點8連線起來,同時還要和右子樹值為12 的節點連線起來。

原始碼:

/**

* 功能說明:description

* 日期:2016-7-20

**/#include#includeusing namespace std;

//二叉樹結構

struct binarytreenode

;//建立結點

binarytreenode* createbinarytreenode(int value);

//連線結點

void connecttreenodes(binarytreenode* pparent, binarytreenode* pleft, binarytreenode* pright);

//列印樹結點

void printtreenode(binarytreenode* pnode);

//列印二叉樹

void printtree(binarytreenode* proot);

//銷毀二叉樹

void destroytree(binarytreenode* proot);

//樹的深度

int treedepth(binarytreenode* proot);

//-----------------//

//遞迴轉換

void convertnode(binarytreenode* pnode, binarytreenode** plastnodeinlist);

//二叉樹與雙向鍊錶轉換,並返回煉表頭節點

binarytreenode* convert(binarytreenode* prootoftree);

//列印雙向鍊錶

void printdoublelinkedlist(binarytreenode* pheadoflist);

//銷毀鍊錶

void destroylist(binarytreenode* pheadoflist);

int main()

//建立樹結點

binarytreenode* createbinarytreenode(int value)

//連線樹結點

void connecttreenodes(binarytreenode* pparent, binarytreenode* pleft, binarytreenode* pright)

}//列印

void printtreenode(binarytreenode* pnode)

else

cout << endl;

}void printtree(binarytreenode* proot)

}//銷毀

void destroytree(binarytreenode* proot)

}//樹的深度

int treedepth(binarytreenode* proot)

//二叉樹與雙向鍊錶的轉換

binarytreenode* convert(binarytreenode* prootoftree)

//遞迴轉換

void convertnode(binarytreenode* pnode, binarytreenode** plastnodeinlist)

//列印雙向鍊錶

void printdoublelinkedlist(binarytreenode* pheadoflist)

printf("\nthe nodes from right to left are:\n");

while (pnode != null)

printf("\n");

}void destroylist(binarytreenode* pheadoflist)

}

結果:

面試題27 二叉搜尋樹與雙向鍊錶

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解 見 注釋 struct treenode class solution void convert treenode proot,treenode plastnodeinli...

面試題27二叉搜尋樹與雙向鍊錶

比如輸入圖4.12 中左邊的二叉搜尋樹,則輸出轉換之後的排序現向鍊錶。在二叉樹中,每個結點都有兩個指向子結點的指標。在雙向鍊錶中,每個結點也有兩個指標,它們分別指向前乙個結點和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上有可能實現二叉搜尋樹和排序的雙向鍊錶...

面試題27 二叉搜尋樹與雙向鍊錶

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如輸入下圖中左邊兒茶搜尋樹,則輸出轉換後的排序雙向鍊錶。10 614 4 812164 6 8 10 12 14 16 將二叉搜尋樹轉化為有序雙向鍊錶,類似於中序遍歷,中序遍歷的...