建立方法construct(nums, l, r),用於找出在陣列 numsnums 中從 ll 到 rr 索引(不包含第 rr 個位置)中最大二叉樹的根節點。
演算法步驟如下:
首先呼叫 construct(nums, 0, n),其中 n 是陣列 numsnums 的長度。
在索引範圍 (l:r−1) 內找到最大值的索引,將 nums[max_idx] 作為根節點。
呼叫 construct(nums, l, max_idx) 建立根節點的左孩子。遞迴執行此操作,建立根節點的整個左子樹。
類似的,呼叫 construct(nums, max_idx + 1, r) 建立根節點的右子樹。
方法 construct(nums, 0, n) 返回最大二叉樹的根節點。
class solution
treenode* construct(vector& nums,int l, int r)
int max(vector& nums,int l, int r)
}return max_idx;
}};
二叉搜尋樹的中序遍歷是公升序序列。
解法的關鍵在於應該按照節點值降序遍歷所有節點,同時記錄我們已經遍歷過的節點值的和,並把這個和加到當前節點的值中。這種遍歷樹的方法被稱作 反序中序遍歷 ,它確保我們按我們想要的順序遍歷每乙個節點。這個演算法的基本思想是遍歷乙個沒有遍歷過的節點之前,先將大於點值的點都遍歷一遍。
class solution
return root;
*///迭代
treenode* node=root;
stacks;
int sum=0;
while(!s.empty() || node!=nullptr)
node=s.top(); s.pop();
sum += node->val;
node->val=sum;
node=node->left;
}return root;
}};
(1)狀態定義:
dp[node][j] :這裡 node 表示乙個結點,以 node 為根結點的樹,並且規定了 node 是否偷取能夠獲得的最大價值。
(2)推導狀態轉移方程
根據當前結點偷或者不偷,就決定了需要從哪些子結點裡的對應的狀態轉移過來。
(3)初始化
乙個結點都沒有,空節點,返回 0,對應後序遍歷時候的遞迴終止條件;
class solution
vectordfs(treenode* root);
vectorleft=dfs(root->left);
vectorright=dfs(root->right);
vectordp(2);
dp[0]=max(left[0],left[1])+max(right[0],right[1]); //dp[0]當前節點不偷
dp[1]=root->val+left[0]+right[0]; //偷當前節點
return dp;
}};
dfs(treenode* root, int sum)
遞推引數: 當前節點 root ,當前目標值 tar 。
終止條件: 若節點 root 為空,則直接返回。
遞推工作:
路徑更新: 將當前節點值 root.val 加入路徑 path ;
目標值更新: tar = tar - root.val(即目標值 tar 從 sum 減至 00 );
路徑記錄: 當 ① root 為葉節點 且 ② 路徑和等於目標值 ,則將此路徑 path 加入 res 。
先序遍歷: 遞迴左 / 右子節點。
路徑恢復: 向上回溯前,需要將當前節點從路徑 path 中刪除,即執行 path.pop() 。
class solution
void dfs(treenode* root, int sum)
dfs(root->left, sum);
dfs(root->right, sum);
// 遞迴完成以後,必須重置變數
path.pop_back();
}};
(1)遞迴:
反轉一顆空樹結果還是一顆空樹。對於一顆根為 r,左子樹為 mboxright, 右子樹為 mboxleft 的樹來說,它的反轉樹是一顆根為 r,左子樹為 mboxright 的反轉樹,右子樹為 mboxleft 的反轉樹的樹。
(2)迭代
這個方法的思路就是,我們需要交換樹中所有節點的左孩子和右孩子。因此可以創乙個佇列來儲存所有左孩子和右孩子還沒有被交換過的節點。開始的時候,只有根節點在這個佇列裡面。只要這個佇列不空,就一直從佇列**隊節點,然後互換這個節點的左右孩子節點,接著再把孩子節點入隊到佇列,對於其中的空節點不需要加入佇列。最終佇列一定會空,這時候所有節點的孩子節點都被互換過了,直接返回最初的根節點就可以了。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
return root;
}};
leetcode200題之二叉樹專題(三)
由對稱二叉樹定義 對於樹中 任意兩個對稱節點 l 和 r 一定有 l val r val 即此兩對稱節點值相等。l left val r right val 即 l 的 左子節點 和 r 的 右子節點 對稱 l right val r left val 即 l 的 右子節點 和 r 的 左子節點 對...
leetcode200題之二叉樹專題(一)
一條路徑的長度為該路徑經過的節點數減一,所以求直徑 即求路徑長度的最大值 等效於求路徑經過節點數的最大值減一。而任意一條路徑均可以被看作由某個節點為起點,從其左兒子和右兒子向下遍歷的路徑拼接得到。我們定義乙個遞迴函式 depth node 計算d node,函式返回該節點為根的子樹的深度。先遞迴呼叫...
演算法題 leetcode200 島嶼數量
題目描述 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。深度搜尋class solution return count public static void combine ...