leetcode200題之二叉樹專題(一)

2021-10-23 10:35:26 字數 2322 閱讀 9561

一條路徑的長度為該路徑經過的節點數減一,所以求直徑(即求路徑長度的最大值)等效於求路徑經過節點數的最大值減一。而任意一條路徑均可以被看作由某個節點為起點,從其左兒子和右兒子向下遍歷的路徑拼接得到。

我們定義乙個遞迴函式 depth(node) 計算d_node,函式返回該節點為根的子樹的深度。先遞迴呼叫左兒子和右兒子求得它們為根的子樹的深度 left 和 right ,則該節點為根的子樹的深度即為max(l,r)+1,該節點的 d_node值為l+r+1

class solution 

int depth(treenode* root, int& ans)

};

遞迴解法:可以對這兩棵樹同時進行前序遍歷,並將對應的節點進行合併。在遍歷時,如果兩棵樹的當前節點均不為空,我們就將它們的值進行相加,並對它們的左孩子和右孩子進行遞迴合併;如果其中有一棵樹為空,那麼我們返回另一顆樹作為結果;如果兩棵樹均為空,此時返回任意一棵樹均可(因為都是空)。

class solution 

};

迭代解法:層序遍歷,將相應節點合併。

//迭代解法

class solution

if(node1->left!=nullptr && node2->left!=nullptr)

if(node1->right!=nullptr && node2->right!=nullptr)

if(node1->left==nullptr && node2->left!=nullptr)

if(node1->right==nullptr && node2->right!=nullptr)

}return t1;}};

recur(a,b)函式:判斷樹 a中以a為根節點的子樹是否包含樹 b;

終止條件:

當節點 b為空:說明樹 bb 已匹配完成(越過葉子節點),因此返回 true;

當節點 a為空:說明已經越過樹 aa 葉子節點,即匹配失敗,返回 false ;

當節點 a和 b 的值不同:說明匹配失敗,返回 false ;

返回值:

判斷 a 和 b 的左子節點是否相等,即 recur(a->left, b->left) ;

判斷 a 和 b 的右子節點是否相等,即 recur(a->right, b->right) 

issubstructure(a, b)函式先序遍歷樹 aa 中的每個節點 a;

特例處理: 當 樹 aa 為空 或 樹 bb 為空 時,直接返回 falsefalse ;

返回值: 若樹 b 是樹 a 的子結構,則必滿足以下三種情況之一,因此用或 || 連線;

以 節點 a 為根節點的子樹 包含樹 bb ,對應 recur(a, b);

樹 b 是 樹 a 左子樹 的子結構,對應 issubstructure(a->left, b);

樹 b 是 樹 a 右子樹 的子結構,對應 issubstructure(a->right, b)

思路:1. 將左子樹插入到右子樹的地方

將原來的右子樹接到左子樹的最右邊節點

考慮新的右子樹的根節點,一直重複上邊的過程,直到新的右子樹為 null

leetcode200題之二叉樹專題(三)

由對稱二叉樹定義 對於樹中 任意兩個對稱節點 l 和 r 一定有 l val r val 即此兩對稱節點值相等。l left val r right val 即 l 的 左子節點 和 r 的 右子節點 對稱 l right val r left val 即 l 的 右子節點 和 r 的 左子節點 對...

leetcode200題之二叉樹專題(四)

建立方法construct nums,l,r 用於找出在陣列 numsnums 中從 ll 到 rr 索引 不包含第 rr 個位置 中最大二叉樹的根節點。演算法步驟如下 首先呼叫 construct nums,0,n 其中 n 是陣列 numsnums 的長度。在索引範圍 l r 1 內找到最大值的...

演算法題 leetcode200 島嶼數量

題目描述 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。深度搜尋class solution return count public static void combine ...