LeetCode高頻題 二叉樹(二)

2021-10-02 09:35:25 字數 2499 閱讀 8480

我開了乙個leetcode會員,選擇了一些高頻率題目。這個系列是希望幫助大家每天花30分鐘的題目了解面試高頻題,讓大家面試更加游刃有餘。

本期我們講解三道的簡單題。上期我們說到關於樹的題目總是會跟遞迴扯上關係,而本期我們從遞迴入手,引出迭代的做法,比如說利用佇列、棧等資料結構代替遞迴操作。本期所用的樹的資料結構均如下:

class

treenode

}

題意:層次遍歷一棵二叉樹,自底向上返回list>,如下圖

這道題相信本科學過《資料結構》的同學一眼就知道這是廣度優先搜尋,要用佇列這個資料結構儲存結點,稍稍需要思考的有兩點:1.如何將每層放入乙個list;2.如何自底向上儲存。對於第乙個問題,我們可以將每一層的佇列長度s存下,然後通過for迴圈將每一層的val存在list中。對於第二個問題,我們可以使用arraylist中的add方法,add方法的第乙個引數就是index,即加入的位置。完整**如下:

public list

>

levelorderbottom

(treenode root)

ans.

add(

0,temp);}

return ans;

}

以上我們使用了廣度優先搜尋,但事實上,這道題還可以使用深度優先搜尋。深度優先搜尋的思想是,記錄每乙個結點所在的層數,這樣相同層數的結點從左到右依次放在同乙個list中。完整**如下:

public list

>

levelorderbottom

(treenode root)

void

levelmaker

(list

> list, treenode root,

int level)

levelmaker

(list, root.left, level+1)

;levelmaker

(list, root.right, level+1)

; list.

get(list.

size()

-level-1)

.add

(root.val)

;}

題意:給乙個遞增的陣列,返回一棵平衡的二叉搜尋樹,如下圖

題意:判斷給定的二叉樹是否對稱

這道題我們的第一反應就是遞迴,根節點的左右兩個子樹對稱,那麼這棵樹就對稱。當然一定是從上到下依次判斷的,不然不好確定比較的物件。**如下:

public

boolean

issymmetric

(treenode root)

boolean

help

(treenode left,treenode right)

這道題用遞迴做的確簡單,需要注意的就是邊界條件,那能不能不用遞迴呢?能!只需要借助乙個棧,控制好入棧出棧順序,就可以實現判斷。**如下:

public

boolean

issymmetric

(treenode root)

return

true

;}

今天我們介紹的幾道題都與迭代有關,對比遞迴的方法,我們發現普遍來說遞迴會比迭代**量少、思路清晰,所以我們更推薦各位同學使用遞迴。當然也不排除面試官讓你使用兩個方法。

明天我們將介紹樹的中等難度題,你們準備好了嗎?

關注我,更多演算法知識點告訴你。

leetcode 二叉樹 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...

LeetCode (二叉樹)反轉二叉樹

遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...

(二叉樹提高題)還原二叉樹

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入格式 輸入首先給出正整數n 50 為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區別大小寫 的字串。輸出格式 輸出為乙個整數,即該二叉樹的高度。輸入樣例 9 abdfghiec fdhgi...