劍指offer刷題(Tree)

2022-07-09 12:30:11 字數 3884 閱讀 4192

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。(約定空樹不是任意乙個樹的子結構)

b是a的子結構, 即 a中有出現和b相同的結構和節點值。

例如:給定的樹 a:

3

/ \4 5

/ \1 2

給定的樹 b:

4 

/ 1

返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。

限制:

0 <= 節點個數 <= 10000

題解思路:

class solution 

public boolean hassubtree(treenode a, treenode b)

}

題目描述

操作給定的二叉樹,將其變換為源二叉樹的映象。

輸入描述:

二叉樹的映象定義:源二叉樹

8

/ \

6 10

/ \ / \

5 7 9 11

映象二叉樹

8/ \

10 6

/ \ / \

11 9 7 5

遞迴

我們在做二叉樹題目時候,第一想到的應該是用遞迴來解決。

仔細看下題目的輸入和輸出,輸出的左右子樹的位置跟輸入正好是相反的,於是我們可以遞迴的交換左右子樹來完成這道題。

看一下動畫就明白了:

遞迴解析:

終止條件: 當節點 root 為空時(即越過葉節點),則返回 null ;

遞推工作:

初始化節點 tmptmp ,用於暫存 root 的左子節點;

開啟遞迴 右子節點 mirrortree(root.right),並將返回值作為root 的 左子節點 。

開啟遞迴 左子節點 mirrortree(tmp),並將返回值作為 root 的 右子節點 。

返回值: 返回當前節點 root ;

**實現如下:

遞迴解法

class solution 

//下面三句是將當前節點的左右子樹交換

treenode tmp = root.right;

root.right = root.left;

root.left = tmp;

//遞迴交換當前節點的 左子樹

mirrortree(root.left);

//遞迴交換當前節點的 右子樹

mirrortree(root.right);

//函式返回時就表示當前這個節點,以及它的左右子樹

//都已經交換完了

return root;

}}

迭代

遞迴實現也就是深度優先遍歷的方式,那麼對應的就是廣度優先遍歷。

廣度優先遍歷需要額外的資料結構--佇列,來存放臨時遍歷到的元素。

深度優先遍歷的特點是一竿子插到底,不行了再退回來繼續;而廣度優先遍歷的特點是層層掃蕩。

所以,我們需要先將根節點放入到佇列中,然後不斷的迭代佇列中的元素。

對當前元素調換其左右子樹的位置,然後:

動態圖如下:

**實現:

class solution 

//如果當前節點的右子樹不為空,則放入佇列等待後續處理

if(tmp.right!=null)

} //返回處理完的根節點

return root;

}}

題目描述

從上往下列印出二叉樹的每個節點,同層節點從左至右列印。

示例1輸入

返回值

[5,4,3,2,1]

方法:層次遍歷

這道題就是乙個模板題,對佇列的使用。因為要滿足先進先出的特性。

初始化:乙個佇列queueq, 將root節點入佇列q

如果佇列不空,做如下操作:

彈出佇列頭,儲存為node,將node的左右非空孩子加入佇列

做2,3步驟,知道隊列為空

**:

public class solution 

return res;}}

題目描述

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

題解:遞迴法

public class solution 

}

給定一棵二叉搜尋樹,請找出其中第k大的節點。

示例 1:

輸入: root = [3,1,4,null,2], k = 1

3

/ \1 4

\ 2

輸出: 4

示例 2:

輸入: root = [5,3,6,2,4,null,null,1], k = 3

5

/ \3 6

/ \2 4

/ 1

輸出: 4

限制:1 ≤ k ≤ 二叉搜尋樹元素個數

題解:

搜尋二叉樹的中序遍歷結果就是按順序排列的。

方法一:

方法二:

**:

//法一:

class solution

private void helper(treenode root, listlist)

}//法二:

class solution

private void helper(treenode root, int k)

if (root.left != null) helper(root.left, k);}}

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。

例如,二叉樹 [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

示例 1:

輸入:root = [1,2,2,3,4,4,3]

輸出:true

示例 2:

輸入:root = [1,2,2,null,3,null,3]

輸出:false

限制:0 <= 節點個數 <= 1000

class solution 

boolean recur(treenode l, treenode r)

劍指offer刷題

面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...

劍指offer刷題

原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...

劍指offer刷題 2

思路 如果從前往後進行遍歷,那麼每次找到乙個空格,則需要新增兩個位元組來進行替換,我們採用先對字串進行遍歷,查詢字串中的空格的個數,然後對新的字串進行長度的計算,然後從後往前進行替換,每遇到乙個空字元,然後進行替換。class solution int oldnumber 0 int numbers...