日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

树的相关笔试面试题

發(fā)布時(shí)間:2023/11/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树的相关笔试面试题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 樹(shù)的創(chuàng)建

已知一個(gè)先序遍歷數(shù)的結(jié)果用數(shù)組表示, 其中空節(jié)點(diǎn)用 null_node 表示, 要求創(chuàng)建出這棵樹(shù). 同樣采用遞歸的思想, 先定義一個(gè)指針, 指向數(shù)組中的第一個(gè)元素, 然后給數(shù)組的第一個(gè)結(jié)點(diǎn)創(chuàng)建相應(yīng)的結(jié)點(diǎn), 然后指針后移, 遞歸創(chuàng)建根節(jié)點(diǎn)的左子樹(shù), 遞歸創(chuàng)建根節(jié)點(diǎn)的右子樹(shù), 最后返回這個(gè)新結(jié)點(diǎn)就可以了

TreeNode* TreeCreate(TreeNodeType array[], int size, TreeNodeType null_node) {if(array == NULL){return NULL;//非法輸入}if(size == 0){return NULL;//非法輸入}if(array[0] == null_node){return NULL;//空樹(shù)}int index = 0;return _TreeCreate(array, size, &index, null_node); }TreeNode* TreeClone(TreeNode* root) {if(root == NULL){return NULL;//空樹(shù)}TreeNode* new_root;TreeInit(&new_root);new_root = CreateTreeNode(root -> data);if(new_root == NULL){return NULL;}//遞歸創(chuàng)建左子樹(shù)new_root -> lchild = TreeClone(new_root -> lchild);//遞歸創(chuàng)建右子樹(shù)new_root -> rchild = TreeClone(new_root -> rchild);return new_root; }

2. 克隆一棵樹(shù)

克隆一棵樹(shù)也采用遞歸的思想, 先創(chuàng)建一個(gè)根節(jié)點(diǎn), 然后遞歸創(chuàng)建根節(jié)點(diǎn)的左子樹(shù), 再遞歸創(chuàng)建根節(jié)點(diǎn)的右子樹(shù)

TreeNode* TreeClone(TreeNode* root) {if(root == NULL){return NULL;//空樹(shù)}TreeNode* new_root;TreeInit(&new_root);new_root = CreateTreeNode(root -> data);if(new_root == NULL){return NULL;}//遞歸創(chuàng)建左子樹(shù)new_root -> lchild = TreeClone(new_root -> lchild);//遞歸創(chuàng)建右子樹(shù)new_root -> rchild = TreeClone(new_root -> rchild);return new_root; }

3. 求二叉樹(shù)的葉子結(jié)點(diǎn)數(shù)

求二叉樹(shù)的所有結(jié)點(diǎn)數(shù)即就是求二叉樹(shù)的左子樹(shù)上的結(jié)點(diǎn)數(shù)加上二叉樹(shù)的右子樹(shù)上的結(jié)點(diǎn)數(shù), 然后左右字?jǐn)?shù)的結(jié)點(diǎn)數(shù)相加即就是二叉樹(shù)的所有葉子結(jié)點(diǎn)數(shù)

int TreeLeafSize(TreeNode* root) {if(root == NULL){return 0;}if(root -> lchild == NULL && root -> rchild == NULL){return 1;}return TreeLeafSize(root -> lchild) + TreeLeafSize(root -> rchild); }

4. 求二叉樹(shù)的節(jié)點(diǎn)數(shù)

求二叉樹(shù)的節(jié)點(diǎn)數(shù)即就是先判斷二叉樹(shù)是不是只有一個(gè)結(jié)點(diǎn), 如果不是, 就遞歸求解出二叉樹(shù)的左子樹(shù)的結(jié)點(diǎn)數(shù), 再遞歸求解二叉樹(shù)的有子樹(shù)的結(jié)點(diǎn)數(shù), 最后根節(jié)點(diǎn)的左右子樹(shù)之和加1就是二叉樹(shù)的結(jié)點(diǎn)總數(shù)

int TreeSize(TreeNode* root) {if(root == NULL){return 0;}return TreeSize(root -> lchild) + TreeSize(root -> rchild) + 1; }

5. 求二叉樹(shù)的高度

如果只有一個(gè)根節(jié)點(diǎn), 則二叉樹(shù)的高度為 1, 否則二叉樹(shù)的高度就是根節(jié)點(diǎn)的左子樹(shù)和右子樹(shù)的高度的最大值 加 1

int TreeHeight(TreeNode* root) {if(root == NULL){return 0;}if(root -> lchild == NULL && root -> rchild == NULL){return 1;}int Lhight = TreeHeight(root -> lchild);int Rhight = TreeHeight(root -> rchild);return 1 + (Lhight > Rhight ? Lhight : Rhight); }

6. 求某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)

如果已知結(jié)點(diǎn)和根節(jié)點(diǎn)相等, 則直接返回根節(jié)點(diǎn), 否則就遞歸的在根節(jié)點(diǎn)的左子樹(shù)中找, 如果沒(méi)有找的就在根節(jié)點(diǎn)的右子樹(shù)中遞歸的找

TreeNode* Parent(TreeNode* root, TreeNode* node) {if(root == NULL || node == NULL){return NULL;}if(root -> lchild == node || root -> rchild == node){return root;}TreeNode* Lparent = Parent(root -> lchild, node);if(Lparent != NULL){return Lparent;}TreeNode* Rparent = Parent(root -> rchild, node);return Rparent; }

7. 銷毀一個(gè)二叉樹(shù)

先遞歸銷毀二叉樹(shù)的左子樹(shù), 再遞歸銷毀二叉樹(shù)的右子樹(shù), 最后銷毀根節(jié)點(diǎn)

void TreeDestroy(TreeNode** root) {if(root == NULL){return;}if(*root == NULL){return;//空樹(shù)}TreeDestroy(&(*root) -> lchild);TreeDestroy(&(*root) -> rchild);free(*root);*root = NULL; }

8. 在二叉樹(shù)中找出給定指的結(jié)點(diǎn)

比較根節(jié)點(diǎn)的 data 和 to_find 是否相等, 相等就返回根節(jié)點(diǎn), 不相等遞歸的和根節(jié)點(diǎn)的左子樹(shù)的 data 比較, 最后和根節(jié)點(diǎn)的右子樹(shù)的data比較

TreeNode* TreeFind(TreeNode* root, TreeNodeType to_find) {if(root == NULL){return NULL;//空樹(shù)}if(root -> data == to_find){return root;}TreeNode* l_node = TreeFind(root -> lchild, to_find);if(l_node != NULL){return l_node;}TreeNode* r_node = TreeFind(root -> rchild, to_find);return r_node; }

9. 非遞歸先序遍歷

先定義一個(gè)棧, 將根節(jié)點(diǎn)入棧, 取棧頂元素到 cur 中, 同時(shí)訪問(wèn)當(dāng)前結(jié)點(diǎn), 將當(dāng)前結(jié)點(diǎn)出棧, 如果當(dāng)前結(jié)點(diǎn)的右子樹(shù)不為空, 就將當(dāng)前結(jié)點(diǎn)的右子樹(shù)入棧, 如果當(dāng)前結(jié)點(diǎn)的左子樹(shù)不為空, 入棧當(dāng)前結(jié)點(diǎn)的左子樹(shù), 循環(huán)取棧頂元素, 直到棧為空.

void TreePreOrderByLoop(TreeNode* root) {if(root ==NULL){return;}SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, root);SeqStackType cur;while(SeqStackGetFront(&stack, &cur)){printf("%c ", cur -> data);SeqStackPop(&stack);if(cur -> rchild != NULL){SeqStackPush(&stack, cur -> rchild);}if(cur -> lchild != NULL){SeqStackPush(&stack, cur -> lchild);}} }

10. 非遞歸中序遍歷

先定義一個(gè)指針指向該節(jié)點(diǎn), 如果當(dāng)前結(jié)點(diǎn)不為空, 入棧當(dāng)前結(jié)點(diǎn), 同時(shí)讓當(dāng)前結(jié)點(diǎn)一直往左走, 直到當(dāng)前結(jié)點(diǎn)為空. 取棧頂結(jié)點(diǎn), 訪問(wèn)當(dāng)前結(jié)點(diǎn), 出棧. 讓當(dāng)前結(jié)點(diǎn)指向它的右子樹(shù)

void TreeInOrderByLoop(TreeNode* root) {if(root == NULL){return;}SeqStack stack;SeqStackInit(&stack);TreeNode* cur = root;while(1){while(cur != NULL){SeqStackPush(&stack, cur);cur = cur -> lchild;}int ret = SeqStackGetFront(&stack, &cur);if(ret == 0){return;}printf("%c ", cur -> data);SeqStackPop(&stack);cur = cur -> rchild;} }

11. 非遞歸后序遍歷

定義一個(gè)指針prev初始化為 NULL來(lái)表示訪問(wèn)的上一個(gè)結(jié)點(diǎn), 同時(shí)定義一個(gè)指針 cur 指向該節(jié)點(diǎn), 再定義一個(gè)指針 top 表示棧頂結(jié)點(diǎn). 將 cur 入棧, 讓當(dāng)前結(jié)點(diǎn)向左走, 直到當(dāng)前結(jié)點(diǎn)為空, 此時(shí)取棧頂元素, 如果當(dāng)前結(jié)點(diǎn) cur -> rchild 和 訪問(wèn)的上一個(gè)結(jié)點(diǎn)相等, 則訪問(wèn)當(dāng)前結(jié)點(diǎn), 同時(shí)將prev的值賦為訪問(wèn)結(jié)點(diǎn)的值, 然后讓 cur 等于 cur -> rchild, 一直循環(huán), 直到取棧頂元素失敗

void TreePostByLoop(TreeNode* root) {if(root == NULL){return;//空樹(shù)}TreeNode* prev = NULL;TreeNode* cur = root;SeqStackType top;SeqStack stack;SeqStackInit(&stack);while(1){while(cur != NULL){SeqStackPush(&stack, cur);cur = cur -> lchild;}int ret = SeqStackGetFront(&stack, &top);if(ret == 0){return;}if(top -> rchild == NULL || top -> rchild == prev){printf("%c ", top -> data);prev = top;SeqStackPop(&stack);}else{cur = top -> rchild;}} }

12. 樹(shù)的鏡像

(1)非遞歸版本

定義一個(gè)指針 cur 指向根節(jié)點(diǎn), 定義一個(gè)隊(duì)列, 將 cur 入隊(duì)列, 取隊(duì)首元素, 將當(dāng)前隊(duì)首元素左右字?jǐn)?shù)進(jìn)行交換, 出隊(duì)列, 如果cur -> lchild != NULL, 就將 cur -> lchild 入隊(duì)列, 如果 cur -> rchild != NULL, cur -> rchild 入隊(duì)列, 循環(huán)上述過(guò)程, 直到取棧頂元素失敗退出循環(huán)就說(shuō)明當(dāng)前樹(shù)已經(jīng)逆置

void TreeMirrorByLoop(TreeNode* root) {if(root == NULL){return;}SeqQue q;SeqQueInit(&q);SeqQueType top = root;SeqQuePush(&q, root);int ret = 0;while(SeqQueGetFront(&q, &top)){TreeNodeSwap(&(top -> lchild), &(top -> rchild));SeqQuePop(&q);if(top -> lchild != NULL){SeqQuePush(&q, top -> lchild);}if(top -> rchild != NULL){SeqQuePush(&q, top -> rchild);}}printf("\n"); }

(2)非遞歸版本求樹(shù)的鏡像

如果當(dāng)前樹(shù)是空樹(shù)則直接返回, 如果當(dāng)前樹(shù)只有一個(gè)根節(jié)點(diǎn), 就直接返回, 否則就逆置當(dāng)前結(jié)點(diǎn)的左子樹(shù), 逆置當(dāng)前結(jié)點(diǎn)的右子樹(shù)

void TreeMirror(TreeNode* root) {if(root == NULL){return;//空樹(shù)}if(root -> rchild == NULL && root -> rchild == NULL){return;}TreeMirror(root -> rchild);TreeMirror(root -> lchild); }

13. 判斷二叉樹(shù)是否為完全二叉樹(shù)

分為兩個(gè)階段, 第一階段判斷當(dāng)前結(jié)點(diǎn)是否具有左右子樹(shù), 如果具有左右字?jǐn)?shù), 就將當(dāng)前結(jié)點(diǎn)左右子樹(shù)入隊(duì)列, 如果當(dāng)前結(jié)點(diǎn)只有右子樹(shù), 沒(méi)有左子樹(shù), 一定不是右子樹(shù), 如果當(dāng)前結(jié)點(diǎn)只有左子樹(shù)沒(méi)有右子樹(shù), 進(jìn)入階段2, 如果當(dāng)前結(jié)點(diǎn)左右子樹(shù)都沒(méi)有, 進(jìn)入第二階段, 第二階段就是當(dāng)前結(jié)點(diǎn)的后面結(jié)點(diǎn)都沒(méi)有子樹(shù), 一直循環(huán), 如果循環(huán)結(jié)束, 并且滿足上述條件, 則說(shuō)明這個(gè)樹(shù)是完全二叉樹(shù), 否則不是

int IsComPletTree(TreeNode* root) {if(root == NULL){return;}TreeNode* cur = root;int start_step_two = 0;SeqQue q;SeqQueInit(&q);SeqQuePush(&q, cur);while(SeqQueGetFront(&q, &cur)){if(start_step_two == 0){if(cur -> rchild != NULL && cur -> lchild != NULL){SeqQuePush(&q, cur -> rchild);SeqQuePush(&q, cur -> lchild);}if(cur -> lchild == NULL && cur -> rchild != NULL){return 0;}if(cur -> lchild != NULL && cur -> rchild == NULL){start_step_two = 1;}if(cur -> lchild == NULL && cur -> rchild == NULL){start_step_two = 1;}}else{if(cur -> lchild == NULL && cur -> rchild == NULL){;}else{return 0;}}}return 1; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的树的相关笔试面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。