面試20之建立含有某一深度上所有結點的鍊錶。

2021-07-31 08:22:18 字數 1484 閱讀 3534

對於一棵二叉樹,請設計乙個演算法,建立含有某一深度上所有結點的鍊錶。

給定二叉樹的根結點指標treenode* root,以及鍊錶上結點的深度,請返回乙個鍊錶listnode,代表該深度上所有結點的值,請按樹上從左往右的順序鏈結,保證深度不超過樹的高度,樹上結點的值為非負整數且不超過100000。

《方法1>:層次遍歷

這個題目的意思就是輸出二叉樹的某一層的所有元素,這個首先想到的是層次遍歷,層次遍歷最簡單的方法就是用佇列實現,我們傳統的層次遍歷方法是可以輸出所有元素,那麼如何區分相鄰兩層之間的元素呢?

其實我們可以用兩個整數變數curlevel,nextlevel來記錄相鄰兩層的元素個數,其中curlevel代表出棧那一層留下的元素個數,nextlevel代表下一層進棧元素的個數,每當curlevel為0的時候,說明上一層已經全部出棧,下一層已經全部入棧,那麼層次遍歷層數就加一,這個時候將nextlevel的值複製給curlevel,nextlevel=0,當遍歷到第dep層的時候,便把那一層的所有元素輸出,停止遍歷。

《方法2>:遞迴遍歷

其實也可以用遞迴遍歷實現,剛開始為深度為dep,每往下遞迴一層,則深度減一(dep=dep-1),當dep==1的時候,便輸出那個元素,如果先遞迴左子樹,那麼則實現從左到右列印,如果先遞迴右子樹,則實現從右往左列印。

樹的節點和鍊錶節點定義:

struct treenode

};struct listnode

};

//第一種方法,非遞迴。

listnode *gettreelevel(treenode *root,int dep)

if(temp->right)

curlevel--;

if(curlevel == 0) //表示這一層遍歷完了。

}listnode *phead = null;

listnode *tail = null;

while(!q.empty()) //此時佇列中存放的是要求的這一層的節點。

else

}return phead;

}

//第二種方式,遞迴,但是鍊錶要有乙個頭節點。

void get(treenode *root,listnode *&head,int dep) //注意這裡要用引用。遞迴會回退,比如在樹中找第二層的節點,在左子樹找到了,head->next = left,head = left,

get(root->left,head,dep-1);

get(root->right,head,dep-1);

}listnode *gettreelevel(treenode *root,int dep)

測試**:

void test()

}int main()

{ test();

cout << "hello..."<

20 包含min的函式

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 在該棧中,呼叫min push及pop的時間複雜度應為o 1 把每次壓棧時的最小元素 每次新壓棧元素和之前的最小元素進行比較 放進另外乙個專門存放最小值的輔助棧中。例如 1 初始空棧,壓入元素3,目前3是最小值,放入輔助棧,...

設計模型之建立者模式 含UML完整例項

1.1 定義與特點 建造者 builder 模式的定義 指將乙個複雜物件的構造與它的表示 給物件屬性賦值 分離,使同樣的構建過程可以建立不同的表示 給物件屬性賦值 這樣的設計模式被稱為建造者模式。它是將乙個複雜的物件分解為多個簡單的物件,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不...

20 包含min函式的棧

思路1 選用存放資料的棧s和存放當前最小值的輔助棧mins,當s記憶體入比當前最小值還小的樹,則該數字入輔助棧,若存放值比當前最小值大,則再次存入當前最小值到輔助棧 這樣mins存在冗餘資訊,可進一步改進。1 class solution else void pop int top int min ...